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

标签 qt dynamic signals-slots

在我的 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...
}

最佳答案

虽然使用 QObject::sender() 完全没问题,但理想的方法是 QSignalMapper

关于Qt:动态小部件信号和插槽连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12173153/

相关文章:

c++ - Qt 处理文件

c++ - 有没有简单的方法来制作可折叠的 QWidget?

java - 使用 JNI 从 Java 创建 QMainWindow

jsf - Primefaces dataScroller 具有子组件的动态 id

python - 槽在哪个线程中执行,我可以将其重定向到另一个线程吗?

c++ - 解析并删除 QString 的一部分

php - 动态为mysql查询中的所有字段名分配别名

c# - 如何通过仅发送类的名称而不是类本身作为参数来获取类的类型?

Python - PyQt 信号 - 发出参数并将其发送到不同的类

c++ - QDialogBu​​ttonBox 按钮没有响应