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



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

EDIT:基于shan的答案,并且因为我需要实例名称而不是QToolButton本身,所以以下是我提出的

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

指针比较似乎运行得很好。

RE-EDIT:并且基于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

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

相关内容

  • 没有找到相关文章

最新更新