Версия для печати темы
Форум на CrossPlatform.RU _ Qt Модель/Представление _ Наследование, gui-класс QtCreator, ui-компилятор
Автор: Fitz 20.5.2011, 13:20
Добавляю в QtCreator к проекту "Класс формы QtDesigner".
Creator создает .h, .cpp, .ui, все как надо. На форму выношу одну кнопку.
cmdsheet.h
#ifndef CMDSHEET_H
#define CMDSHEET_H
#include <QWidget>
#include "ui_cmdsheet.h"
namespace Ui {
class CmdSheetWidget;
}
class CmdSheetWidget : public QWidget
{
Q_OBJECT
public:
CmdSheetWidget(QWidget *parent = 0);
~CmdSheetWidget();
private:
Ui::CmdSheet *uiCmdSheet;
};
#endif // CMDSHEET_H
cmdsheet.cpp#include "cmdsheet.h"
CmdSheetWidget::CmdSheetWidget(QWidget *parent) :
QWidget(parent),
uiCmdSheet(new Ui::CmdSheet)
{
uiCmdSheet->setupUi(this);
pushButton->click(); // компилятор выдает ошибку
uiCmdSheet->pushButton->click(); // все нормально
}
CmdSheetWidget::~CmdSheetWidget()
{
delete uiCmdSheet;
}
Добавляю в описание класса наследоваине от
Ui::CmdSheet, чтобы работать только со своим классом.
class CmdSheetWidget : public QWidget, public Ui::CmdSheet
Компилируется нормально, но при запуске(создании экземпляра этого класса) все вылетает.
Не могу понять, что я делаю не так, дефолтные gui-приложения креатор создает подобным образом и они нормально работают.
И вообще интересует вопрос автоматического создания структуры класса GUI в Qt, некоторые вещи до сих пор остаются для меня тайной.
Автор: Litkevich Yuriy 20.5.2011, 17:01
Цитата(Fitz @ 20.5.2011, 16:20)
pushButton->click(); // компилятор выдает ошибку
потому-что в классе
CmdSheetWidget у тебя нет члена
pushButtonЦитата(Fitz @ 20.5.2011, 16:20)
Добавляю в описание класса наследоваине от Ui::CmdSheet, чтобы работать только со своим классом.
не понял о чём речь в выделеном.
Наследование от Ui::CmdSheet делают, чтобы члены класса Ui::CmdSheet стали и членами
CmdSheetWidget.
Цитата(Fitz @ 20.5.2011, 16:20)
но при запуске(создании экземпляра этого класса) все вылетает.
а ты для
CmdSheetWidget вызываешь
setupUi(this); или оставил остальной код не изменным?
Если не вызываешь, то объект
pushButton не инициализирован и при попытке у нулевого указателя вызывать метод
click() приведёт к аварийному завершению программы.
посмотри внимательно конструктор своего класса и разберись, что в нём происходит и в какой последоваетльности.
Подробно и в примерах о том как используются ui-файлы смотри http://doc.crossplatform.ru/qt/4.7.x/designer-using-a-ui-file.html
Автор: Fitz 20.5.2011, 18:05
Цитата(Litkevich Yuriy @ 20.5.2011, 18:01)
а ты для CmdSheetWidget вызываешь setupUi(this); или оставил остальной код не изменным?
Ох, точно, а слона-то я и не приметил. Он естественно в конструкторе выполнял функцию экземпляра класса CmdSheet через указатель uiCmdSheet, в то время как я уже унаследовал CmdSheetWidget от него. Заработало, спасибо.
Однако меня смущает принцип создания gui-классов в QtCreatore? Потому что обычно он создает класс так:
cmdsheet.h#ifndef CMDSHEET_H
#define CMDSHEET_H
#include <QWidget>
#include "ui_cmdsheet.h"
namespace Ui {
class CmdSheetWidget;
}
class CmdSheetWidget : public QWidget, public Ui::CmdSheet
{
Q_OBJECT
public:
CmdSheetWidget(QWidget *parent = 0);
~CmdSheetWidget();
private:
Ui::CmdSheet *uiCmdSheet;
};
#endif // CMDSHEET_H
Ничего, кажется, непонятного, но...
...и класс наследует от класса GUI(CmdSheet, который ui-компилятор собственно и создает), и еще в этом классе создает указатель на объект родительского класса
Ui::CmdSheet *uiCmdSheet;.
Подозреваю, что это сделано по заветам полиморфизма в который я только недавно худо-бедно въехал, но зачем? Чтобы класс как-то сам с собой через указатель работал?
Автор: Litkevich Yuriy 20.5.2011, 21:18
Цитата(Fitz @ 20.5.2011, 21:05)
и класс наследует от класса GUI(CmdSheet, который ui-компилятор собственно и создает), и еще в этом классе создает указатель на объект родительского класса Ui::CmdSheet *uiCmdSheet;.
у меня креатор так не делает. В зависимости от выбранного способа использования UI-файла, генерит разный код.
Выбрать способ использования UI-файла можно в настройках (т.е. не оперативно)
Инструменты -> Параметры
В левой панели диалога выбираешь "Дизайнер", вкладка "Создание класса"
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)