Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt GUI _ Компилируется, но не запускается

Автор: xu-user 22.6.2011, 10:29

Доброго времени суток.
Делал пример по книжке Бланшет-Саммерфильд, компилируется нормально, но при запуске выдаёт "прекращение работы программы" Что не так, понять не могу.
Вот исходники:

хедер окна диалога:

#ifndef SORTDIALOG_H
#define SORTDIALOG_H

#include <QDialog>
#include "ui_sortdialog.h"

class SortDialog:public QDialog, public Ui::SortDialog
{
    Q_OBJECT;

    public:
        SortDialog(QWidget* parent = 0);
};

#endif // SORTDIALOG_H


Его реализация:
#include <QtGui>
#include "sortdialog.h"

SortDialog::SortDialog(QWidget *parent)
    :QDialog(parent)
{
    secondaryGroupeBox->hide();
    tertiaryGroupeBox->hide();

    layout()->setSizeConstraint(QLayout::SetFixedSize);

}


Маин:
#include <QtGui/QApplication>
#include "sortdialog.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    SortDialog *dialog = new SortDialog;
    dialog->show();
    return app.exec();
}


В чем я ошибся ?

Автор: silver47 22.6.2011, 10:47

откуда берутся указатели secondaryGroupeBox, tertiaryGroupeBox, layout() и на что они, по вашему, указывают?

Автор: xu-user 22.6.2011, 10:55

class SortDialog:public QDialog, public Ui::SortDialog
Вот отсюда думал, если наследовать "Ui::SortDialog" то можно обращаться к элементам формы сразу по имени. Qt мне сразу дописывал их названия, вот и решил что видит значит.
не так ?

Автор: silver47 22.6.2011, 11:04

У Вас есть форма этого диалога, на котором Вы разместили в дизайнере эти элементы?

В общем так:
если использовался дизайнер для создания формы (имеет место быть файл sortdialog.ui в директории с проектом), то:
sortdialog.h дополниться:

namespace Ui {
    class SortDialog;
}
// разрыв
private:
    Ui::SortDialog *ui;

конструктор sortdialog.cpp будет такой:
SortDialog::SortDialog(QWidget *parent) :  QWidget(parent),  ui(new Ui::SortDialog)
{
    ui->setupUi(this);

    // теперь Ваш текс:
    ui->secondaryGroupeBox->hide();
    ui->tertiaryGroupeBox->hide();
}


Если дизайнер НЕ использовался, то сначала Вам необходимо создать объекты, на которые Вы указателями будите ссылаться, иначе указатель указывает на произвольную область памяти. Когда Вы пытаетесь с ней что-либо делать, то ОС закрывает Ваше приложение.

Вот архив с исходником проекта из этой книги. У Вас, видимо, отсутствует файл ui:

 sort.zip ( 2.66 килобайт ) : 115
 

Автор: xu-user 22.6.2011, 11:19

Да, использовался дизайнер. Сделал как написано, жалуется на строчку "ui->setupUi(this);"

..\ExtendedDialog_!\sortdialog.cpp: In constructor 'SortDialog::SortDialog(QWidget*)':

..\ExtendedDialog_!\sortdialog.cpp:8: error: no matching function for call to 'Ui::SortDialog::setupUi(SortDialog* const)'

./ui_sortdialog.h:69: note: candidates are: void Ui_SortDialog::setupUi(QMainWindow*)


типы не совпадают, хотя в примерах видел точно такую же картину и всё работает. :mellow:

Автор: silver47 22.6.2011, 11:34

Запустите то, что я прислал. Пришлите сюда свой вариант, который не работает, поглядим.

Автор: xu-user 22.6.2011, 11:41

То что вы прислали - работает. Но что не так у меня я не понимаю... всё тоже самое =\
Вот мой проект, интересно очень в чем проблема.
 ExtendedDialog__.zip ( 4.3 килобайт ) : 160

Автор: silver47 22.6.2011, 11:49

а что за класс MainWindow? Реализация его есть, а заголовочника нет.

Автор: xu-user 22.6.2011, 11:57

Нету же ни того ни другого :blink: Где вы его увидели ?

Автор: silver47 22.6.2011, 12:10

Ошибка в файле UI.
Вы Выбрали какой шаблон при создании файла UI? Наверняка, по-умолчанию - QMainWindow :) вот отсюда и все грабли.

Автор: xu-user 22.6.2011, 12:20

Аа.. всё тогда ясно. Засада. Просто я в начале делал этот ui фаил как отдельную программу, он там и был mainwindow, а потом создал уже SortDialog и туда запихал его, а хедер и реализацию написал новую как QDialog. В том проекте всё было верно, а тут не совпало. Вот и косяк :unsure:
Благодарю за помощь.

Автор: Алексей1153 22.6.2011, 12:25

class SortDialog : public QDialog, public Ui::SortDialog

->
class SortDialog : public QMainWindow, public Ui::SortDialog



SortDialog::SortDialog(QWidget *parent)
    : QDialog(parent)

->
SortDialog::SortDialog(QWidget *parent)
     : QMainWindow(parent)


:)

Автор: silver47 22.6.2011, 12:34

Вообще достаточно было выбрать нужный шаблон.
Файл - новый проект - GUI приложение - указываем название и путь, куда исходники сохранять, Указываем конфигурацию сборки(чаще всего Desktop), А вот и выбор шаблона:
Имя класса : (по умолчанию - MainWindow) Пишем - SortDialog
Базовый класс: (по умолчанию - QMainWidnow) выбираем - QDialog (мы же диалог создаем?)
и все... жмем далее и радуемся )

Автор: Litkevich Yuriy 22.6.2011, 12:51

Цитата(silver47 @ 22.6.2011, 14:04) *
sortdialog.h дополниться:
namespace Ui {
class SortDialog;
}
в этом нет нужды, у него заголовочник сразу подключается

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)