Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: edd_k от Март 01, 2012, 23:08



Название: Обработка сигнала из динамически подключаемого виджета слотом в главном окне
Отправлено: edd_k от Март 01, 2012, 23:08
Всем доброго здравия!

Допустим есть такое приложение:

(http://clip2net.com/clip/m76758/1330631972-clip-12kb.png)

И допустим, что действие для кнопки 2 находится в компетенции самого виджета, но вот действие для кнопки 1 - глобальное, т.е. находится в компетенции главной формы (что-нибудь типа открытия файла). В классе главной формы имеем паблик слот process_something().

1. При проектировании формы виджета мы вообше не видим главную форму, т.е. не имеем возможности обратиться к ее слотам. Т.е. в дизайнере форм получается вообще не судьба?

2. В коде виджета мы конечно же имеем доступ к главной форме через свойство parent. Получается, вижу пока что только пару вариантов:
- в коде виджета инклудить MainWindow.h, преобразовывать parent к MainWindow и вызывать его слот;
- создать глобально "хранилище" глобальных экшинов и инклудить это хранилище в главной форме и во всех виджетах.

Какие еще есть способы (более элегантные, простые или правильные) для взаимодействия дочернего окна/виджета с родительским? ВОзможно ли сделать привязку к сигнагу дочечернего виджета слота родительского окна прямо в дизайнере?


Название: Re: Обработка сигнала из динамически подключаемого виджета слотом в главном окне
Отправлено: LisandreL от Март 01, 2012, 23:17
У виджета1 завести сигнал, связать его с сигналом «глобальной» кнопки. (connect может связывать не только сигнал со слотом но и сигнал с сигналом)
Сигнал виджета уже связать с нужным слотом главной формы.

Ещё можно у виджета ui переместить в public и добираться до элементов виджета уже в главной форме (не забыв сделать #include "ui_xxxxxx.h"), но на мой взгляд первый вариант правильнее.


Название: Re: Обработка сигнала из динамически подключаемого виджета слотом в главном окне
Отправлено: edd_k от Март 02, 2012, 00:45
Спасибо за быстрый ответ!

Еще не заметил, что parent - это всего-лишь QObject, а вот parentWidget - QWidget. То-то думаю, что так мало свойств у парента ))


Название: Re: Обработка сигнала из динамически подключаемого виджета слотом в главном окне
Отправлено: LisandreL от Март 02, 2012, 06:27
Еще не заметил, что parent - это всего-лишь QObject, а вот parentWidget - QWidget. То-то думаю, что так мало свойств у парента
Ну указатель это один и тот же, просто приведённый к разным типам.


Название: Re: Обработка сигнала из динамически подключаемого виджета слотом в главном окне
Отправлено: vunder от Март 02, 2012, 12:08
Можно  создать интерфейс, от которого будут наследоваться виджеты. В этом интерфейсе объявить сигнал. В главной форме, после создания нового виджета, связывает сигнал-слот.


Название: Re: Обработка сигнала из динамически подключаемого виджета слотом в главном окне
Отправлено: LisandreL от Март 02, 2012, 16:19
В этом интерфейсе объявить сигнал.
Сигнал может быть только у наследника QObject, а дальше с множественным наследованием у вас всё получится плохо и грустно, так как в QWidget'е оно уже не виртуальное.