как я могу скрыть виджет, который сгенерировал сигнал в qt

#qt #hide #signals #qwidget #generated

#qt #скрыть #сигналы #qwidget #сгенерированный

Вопрос:

Допустим, у нас есть более одного виджета, и все они имеют кнопку главного меню. итак, я подключил все кнопки главного меню clicked signal к одному слоту, который должен иметь

 connect(widget1->mainMenuButton, SIGNAL(clicked()),this, SLOT(mainClicked()));
connect(widget1->mainMenuButton, SIGNAL(clicked()),this, SLOT(mainClicked()));
  

и у меня есть

 private slots:
    void mainClicked();
  

в mainClicked я хочу скрыть того, кто вызвал сигнал clicked. frame1 или frame2 в приведенном выше примере.

Я мог бы использовать sender () для извлечения QObject, который вызвал сигнал, но тогда как я могу вызвать hide, который является функцией QWidget?

я ценю вашу помощь.

Ответ №1:

Я думаю, это должно сработать:

 dynamic_cast<QWidget*>(sender()) -> hide() ;
  

Комментарии:

1. спасибо, что я сделал это QObject caller = sender()-> parent(); ((QWidget )caller)-> hide(); потому что отправитель был бы дочерним элементом виджета

2. qobject_cast<QWidget *>(отправитель())-> window()-> hide(); если вы хотите скрыть все окно отправителя

Ответ №2:

Взгляните на QSignalMapper класс. По сути, вы подключаете clicked() сигнал ваших двух виджетов к map() слоту преобразователя сигналов, и он выдает один mapped(QWidget*) сигнал, который вы подключаете к своему mainClicked(QWidget*) слоту, и вы получаете переданный виджет, который излучал clicked сигнал (на самом деле вы можете настроить параметр самостоятельно). Документация Qt может рассказать вам больше.