Наследование, gui-класс QtCreator, ui-компилятор, вопрос по созданию класса |
Здравствуйте, гость ( Вход | Регистрация )
Наследование, 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
cmdsheet.cpp
Добавляю в описание класса наследоваине от Ui::CmdSheet, чтобы работать только со своим классом.
Компилируется нормально, но при запуске(создании экземпляра этого класса) все вылетает. Не могу понять, что я делаю не так, дефолтные gui-приложения креатор создает подобным образом и они нормально работают. И вообще интересует вопрос автоматического создания структуры класса GUI в Qt, некоторые вещи до сих пор остаются для меня тайной. |
|
|
Litkevich Yuriy |
20.5.2011, 17:01
Сообщение
#2
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
pushButton->click(); // компилятор выдает ошибку потому-что в классе CmdSheetWidget у тебя нет члена pushButtonДобавляю в описание класса наследоваине от Ui::CmdSheet, чтобы работать только со своим классом. не понял о чём речь в выделеном.Наследование от Ui::CmdSheet делают, чтобы члены класса Ui::CmdSheet стали и членами CmdSheetWidget. но при запуске(создании экземпляра этого класса) все вылетает. а ты для CmdSheetWidget вызываешь setupUi(this); или оставил остальной код не изменным?Если не вызываешь, то объект pushButton не инициализирован и при попытке у нулевого указателя вызывать метод click() приведёт к аварийному завершению программы. посмотри внимательно конструктор своего класса и разберись, что в нём происходит и в какой последоваетльности. Подробно и в примерах о том как используются ui-файлы смотри в Асистенте |
|
|
Fitz |
20.5.2011, 18:05
Сообщение
#3
|
Студент Группа: Новичок Сообщений: 13 Регистрация: 22.11.2010 Пользователь №: 2207 Спасибо сказали: 0 раз(а) Репутация: 0 |
а ты для CmdSheetWidget вызываешь setupUi(this); или оставил остальной код не изменным? Ох, точно, а слона-то я и не приметил. Он естественно в конструкторе выполнял функцию экземпляра класса CmdSheet через указатель uiCmdSheet, в то время как я уже унаследовал CmdSheetWidget от него. Заработало, спасибо. Однако меня смущает принцип создания gui-классов в QtCreatore? Потому что обычно он создает класс так: cmdsheet.h
Ничего, кажется, непонятного, но... ...и класс наследует от класса GUI(CmdSheet, который ui-компилятор собственно и создает), и еще в этом классе создает указатель на объект родительского класса Ui::CmdSheet *uiCmdSheet;. Подозреваю, что это сделано по заветам полиморфизма в который я только недавно худо-бедно въехал, но зачем? Чтобы класс как-то сам с собой через указатель работал? |
|
|
Litkevich Yuriy |
20.5.2011, 21:18
Сообщение
#4
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
и класс наследует от класса GUI(CmdSheet, который ui-компилятор собственно и создает), и еще в этом классе создает указатель на объект родительского класса Ui::CmdSheet *uiCmdSheet;. у меня креатор так не делает. В зависимости от выбранного способа использования UI-файла, генерит разный код.Выбрать способ использования UI-файла можно в настройках (т.е. не оперативно) Инструменты -> Параметры В левой панели диалога выбираешь "Дизайнер", вкладка "Создание класса" |
|
|
Текстовая версия | Сейчас: 20.4.2024, 0:23 |