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

时间:2012-08-29 07:50:13

标签: qt dynamic signals-slots

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

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

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...
}

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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