crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Наследование, gui-класс QtCreator, ui-компилятор, вопрос по созданию класса
Fitz
  опции профиля:
сообщение 20.5.2011, 13:20
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 13
Регистрация: 22.11.2010
Пользователь №: 2207

Спасибо сказали: 0 раз(а)




Репутация:   0  


Добавляю в 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
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9666
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(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-файлы смотри в Асистенте
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Fitz
  опции профиля:
сообщение 20.5.2011, 18:05
Сообщение #3


Студент
*

Группа: Новичок
Сообщений: 13
Регистрация: 22.11.2010
Пользователь №: 2207

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(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
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9666
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Fitz @ 20.5.2011, 21:05) *
и класс наследует от класса GUI(CmdSheet, который ui-компилятор собственно и создает), и еще в этом классе создает указатель на объект родительского класса Ui::CmdSheet *uiCmdSheet;.
у меня креатор так не делает. В зависимости от выбранного способа использования UI-файла, генерит разный код.

Выбрать способ использования UI-файла можно в настройках (т.е. не оперативно)
Инструменты -> Параметры
В левой панели диалога выбираешь "Дизайнер", вкладка "Создание класса"
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 22.4.2021, 23:11