如何使用信号/槽机制获取发送者小部件?

Posted

技术标签:

【中文标题】如何使用信号/槽机制获取发送者小部件?【英文标题】:How to get sender widget with a signal/slot mechanism? 【发布时间】:2010-10-28 20:18:23 【问题描述】:

可以将多个信号绑定到一个插槽(不是吗?)。那么,有没有办法了解哪个小部件发送信号?我正在寻找类似sender .NET 中事件的参数

【问题讨论】:

【参考方案1】:

在槽中使用QObject::sender(),如下例所示:

void MainWindow::someSetupFunction( void )

   ...
   connect( _foobarButton, SIGNAL(clicked()), this, SLOT(buttonPressedSlot()) );


void MainWindow::buttonPressedSlot()

   // e.g. check with member variable _foobarButton
   QObject* obj = sender();
   if( obj == _foobarButton )
    
      ...
   

   // e.g. casting to the class you know its connected with
   QPushButton* button = qobject_cast<QPushButton*>(sender());
   if( button != NULL ) 
    
      ...
   


【讨论】:

qobject_cast 不是比普通的 dynamic_cast 更好吗? @elephant 是的,如doc.qt.io/qt-4.8/metaobjects.html 所述。这应该在答案中得到改进。【参考方案2】:

QObject::sender() 将完成这项工作。

【讨论】:

【参考方案3】:

是的,您可以将多个信号连接到一个插槽。在这种情况下,您将使用QSignalMapper 来区分信号源。此解决方案仅限于无参数信号。你可以看一个例子here。

【讨论】:

以上是关于如何使用信号/槽机制获取发送者小部件?的主要内容,如果未能解决你的问题,请参考以下文章

QT的信号槽机制

获取从 QTableWidget 中的单元格小部件发出的信号发送器的行索引

Qt:动态小部件信号和槽连接

QObject三大核心功能——信号与槽

QlineEdit 和信号&槽

从主窗口中的 UI 文件加载带有信号槽定义的小部件