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

Posted

技术标签:

【中文标题】Qt:动态小部件信号和槽连接【英文标题】:Qt: dynamic widgets signal and slot connection 【发布时间】:2012-08-29 07:50:13 【问题描述】:

在我的 Qt 应用程序中,我动态创建了一些小部件。其中包括需要具有类似行为的 QToolButton。

以下是小部件的创建方式:

QMap<QString, QToolButton*> unselectButtonMap;
foreach(QString instance, ...) 
  unselectButtonMap[instance] = new QToolButton;
  myLayout->addWidget(unselectButtonMap[instance]);
  QObject::connect(unselectButtonMap[instance],SIGNAL(clicked()),this,SLOT(unselectInstance()));

现在我想让unselectInstence 槽知道关注哪个实例。

我首先考虑将实例名称作为参数提供给插槽,但插槽仅从信号中获取参数。这个想法是这样的:

QObject::connect(unselectButtonMap[instance],SIGNAL(clicked()),this,SLOT(unselectInstance(instance)));

关于如何做到这一点的任何其他想法?

注意:我使用的是 Qt4.8

编辑: 基于 shan 的回答,因为我需要实例名称而不是 QToolButton 本身,这就是我想出的

void MyWindow::unselectInstance() 
  foreach(QString instance, unselectButtonMap.keys()) 
    if(unselectButtonMap[instance] == QObject::sender()) 
      //do stuff here...
    
  

指针比较似乎工作得很好。

重新编辑:并根据 user1313312 的回答,我们将声明一个 QSignalMapper:

QSignalMapper *signalMapper = new QSignalMapper(this);
QObject::connect(signalMapper, SIGNAL(mapped(QString)), this, SLOT(unselectInstance(QString)));

然后将 QToolButton 连接到映射器

signalMapper->setMapping(unselectButtonMap[instance], instance);
QObject::connect(unselectButtonMap[instance],SIGNAL(clicked()),signalMapper,SLOT(map()));

而且插槽会简单得多:

void MyWindow::unselectinstance(QString instance) 
  //do stuff here...

【问题讨论】:

【参考方案1】:

虽然使用QObject::sender() 非常好,但理想的方法是QSignalMapper

【讨论】:

你是对的。它避免自己进行 foreach 和比较。谢谢。【参考方案2】:

在您的插槽中使用QObject::sender() 来获取发件人。它将返回发出信号的对象。希望这会有所帮助。

【讨论】:

完美,正是我需要的。谢谢。

以上是关于Qt:动态小部件信号和槽连接的主要内容,如果未能解决你的问题,请参考以下文章

qt中的信号和槽机制

QT-自定义信号和槽

QT信号和槽

C++ GUI Qt的建立连接,信号和槽

初见QT---信号和槽

Qt信号和槽的问题