![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
LE0N |
![]()
Сообщение
#1
|
Студент ![]() Группа: Участник Сообщений: 97 Регистрация: 10.3.2009 Из: Беларусь Пользователь №: 604 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Имеется форма, в которой разный функционал, но одинаковый интерфейс(GUI).
Хотелось бы эту форму использывать в двух разных классах отнаследованных от QDialog.... Прикрутил ui_form.h к хиадеру с новым ребёнком QDalog, форма всё нормально отображается. Но вот слоты, почему то, не работают.(Они подключаются в ui_form.h ) Ругается примерно так: Цитата Object::connect: No such slot QDialog::select_product_type(int) in ui_shipmentform.h:77 Object::connect: (sender name: 'comboBox') Object::connect: (receiver name: 'ShipmentFormClass') Хотя слот объявлен.... Во второй форме, где тоже объявлен этот слот, всё работает на 5+. В чём проблема? Сообщение отредактировал LE0N - 27.3.2009, 12:42 |
|
|
![]() |
Litkevich Yuriy |
![]()
Сообщение
#2
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
LE0N |
![]()
Сообщение
#3
|
Студент ![]() Группа: Участник Сообщений: 97 Регистрация: 10.3.2009 Из: Беларусь Пользователь №: 604 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Так я наследника QDialog передаю...
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#4
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
LE0N |
![]()
Сообщение
#5
|
Студент ![]() Группа: Участник Сообщений: 97 Регистрация: 10.3.2009 Из: Беларусь Пользователь №: 604 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Ну и, собственно, ui.setupUi(QDialog*) коннектит сигналы к слотам наследника. Я так понимаю, что QT ругается на QDialog потому что в setupUi передаётся указатель на QDialog типа... НО! Тоже самое делается во второй форме. И там всё работает.... |
|
|
igor_bogomolov |
![]()
Сообщение
#6
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
Цитата Object::connect: No such slot QDialog::select_product_type(int) in ui_shipmentform.h:77 Object::connect: (sender name: 'comboBox') Object::connect: (receiver name: 'ShipmentFormClass') Всю информацию компилятор вам сообщил, что тут еще непонятного? Смотрим приведенный код: Слот select_product_type(int) принадлежит классу shipment_operation. Коннект делается в классе ShipmentFormClass, следущим образом Цитата QObject::connect(comboBox, SIGNAL(currentIndexChanged(int)), ShipmentFormClass, SLOT(select_product_type(int))); Приемщик сигнала в данном случае ShipmentFormClass. Есть у него слот select_product_type(int)? НЕТ. Об этом компилятор вам подробно и сообщает. |
|
|
LE0N |
![]()
Сообщение
#7
|
Студент ![]() Группа: Участник Сообщений: 97 Регистрация: 10.3.2009 Из: Беларусь Пользователь №: 604 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Цитата void setupUi(QDialog *ShipmentFormClass); ШипментФормКласс в данном случае - указатель на shipment_operation Это следует из: Цитата ui.setupUi(this); В конструкторе shipment_operation Или я чего-то не понимаю? |
|
|
Litkevich Yuriy |
![]()
Сообщение
#8
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
igor_bogomolov |
![]()
Сообщение
#9
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#10
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
igor_bogomolov |
![]()
Сообщение
#11
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
указатель показывает на shipment_operation, в котором есть такая функция Извените Юрий, но насколько я понимаю, в данном случае Вы не правы void setupUi(QDialog *ShipmentFormClass) ShipmentFormClass указатель именно на QDialog, который ничего не знает о данном слоте. Сделайте тестовое приложение, проверьте ![]() |
|
|
LE0N |
![]()
Сообщение
#12
|
Студент ![]() Группа: Участник Сообщений: 97 Регистрация: 10.3.2009 Из: Беларусь Пользователь №: 604 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Добавил Q_OBJECT всё заработало
![]() Не мог предположить даже ![]() |
|
|
igor_bogomolov |
![]()
Сообщение
#13
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
???
Добавил Q_OBJECT всё заработало )) Значит я ничего не понимаю в программировании. Объясните мне где я был не прав? P.S. Про Q_OBJECT все понятно. Вот здесь непонятно void setupUi(QDialog *ShipmentFormClass); Ну QDialog же это!!! Сообщение отредактировал igor_bogomolov - 28.3.2009, 1:43 |
|
|
LE0N |
![]()
Сообщение
#14
|
Студент ![]() Группа: Участник Сообщений: 97 Регистрация: 10.3.2009 Из: Беларусь Пользователь №: 604 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Цитата Ну QDialog же это!!! Я тоже задавался этим вопросом ещё до создания топика. Но тот факт, что в другой форме всё работает, отбросил все вопросы на эту тему на задний план... Скорее всего в макросе Q_OBJECT есть функция, которая возвращает текущее имя объекта. После чего в функции connect идёт автоматический автокаст...Что то такое хитрое, скорее всего... И ещё один ньюанс - для того, что бы использывать Q_OBJECT нужно запускать qmake который, в свою очередь, создаёт моки... Там тоже, скорее всего, часть реализации скрыта. Но вникать в систему, пока нет ни времени не желания... Сообщение отредактировал LE0N - 27.3.2009, 23:48 |
|
|
igor_bogomolov |
![]()
Сообщение
#15
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
Можете приложить архивчик с полным текстом своего проекта. Хочу посмотреть полностью что там происходит.
У меня в тестовом проекте ничего подобного не получается. В принципе не понимаю откуда в ui_***.h, который, по идее, должен генерироваться из ui формы, берется QObject::connect(comboBox, SIGNAL(currentIndexChanged(int)), ShipmentFormClass, SLOT(select_product_type(int))); Откуда там вообще конекты? Вы просто сохранили у себя ui_***.h чтоли, а эти строки добавили сами? |
|
|
Litkevich Yuriy |
![]()
Сообщение
#16
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
Вот здесь непонятно нет! Это в певую очередь указатель! просто он имеет тип QDialog, т.е. может ссылаться на QDialog и его наследников.void setupUi(QDialog *ShipmentFormClass); Ну QDialog же это!!! А класс shipment_operation как раз и есть наследник QDialog. И в конструкторе этого класса в функцию setupUi передается указатель именно на shipment_operation. См. пояснение в сообщении №7. П.С. Я в начале тоже стрмозил, и не посмотрел на объявление иначе б проблема раньше всплыла. Для справки: Троли рекомендуют у всех прямых или косвенных наследников QObject в обявлении класса писать макрос Q_OBJECT, даже если не исполуются сигналы и слоты. |
|
|
igor_bogomolov |
![]()
Сообщение
#17
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
Создал у себя тестовый проект.
Добавил после компиляции в ui_**.h коннект
На самом деле слот вызывается. Сделал далее new_testClass->myslot(); Естественно получил ошибку при компиляции, потому что new_testClass указатель на QDialog, и о myslot() ему ничего неизвестно. Видимо надо мне книжечки по С++ еще почитать, востановить пробелы в образовании, а то докоца логика мне так и непонятна. ![]() |
|
|
Litkevich Yuriy |
![]()
Сообщение
#18
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
new_testClass->myslot(); все верно, т.к. new_testClass указатель на базовый класс, в котором нет такой функции. А в наследнике есть.Естественно получил ошибку при компиляции, потому что new_testClass указатель на QDialog, и о myslot() ему ничего неизвестно. И соединение Qt выполняет во время выполнения программы, когда этот указатель, если програмист всё сделал правильно, будет указывать на объект-наследник QDialog распологающий этой функцией. Если она помечена как слот (нужен: макрос Q_OBJECT и ключевое слово slots), то во время выполнения Qt сможет произвести соединение. |
|
|
igor_bogomolov |
![]()
Сообщение
#19
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
Спасибо за науку. Надо будет еще раз почитать про RTTI.
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#20
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
про RTTI. про нее бессмысленно, если я не ошибаюсь, в Qt свой механизм реализован, чтобы не зависить от компилятора. Их целая куча поддерживается в основном благодаря этому. (см. сообщение и выше, я не помню, где начало)
|
|
|
LE0N |
![]()
Сообщение
#21
|
Студент ![]() Группа: Участник Сообщений: 97 Регистрация: 10.3.2009 Из: Беларусь Пользователь №: 604 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Цитата В принципе не понимаю откуда в ui_***.h, который, по идее, должен генерироваться из ui формы, берется QObject::connect(comboBox, SIGNAL(currentIndexChanged(int)), ShipmentFormClass, SLOT(select_product_type(int))); Откуда там вообще конекты? Не знаю как у вас, но у меня в эклипсе (едиторе форм) имеется возможность работы со слотами ![]() Вот оттуда у меня она и берётся ![]() |
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 15.6.2025, 10:46 |