如何在QT中将变量传递给槽方法?

Nek*_*eko 11 c++ qt signals-slots

我正在制作一个聊天信使程序,需要用户加入的聊天频道列表.为了以图形方式表示这个列表,我列出了一个列表QPushButtons,它们都代表了一个不同的通道.这些按钮是用以下方法制作的,这就是我的问题所在:

void Messenger::addToActivePanels(std::string& channel)
{
    activePanelsContents = this->findChild<QWidget *>(QString("activePanelsContents"));
    pushButton = new QPushButton(activePanelsContents);
    pushButton->setObjectName("pushButton");
    pushButton->setGeometry(QRect(0, 0, 60, 60));
    pushButton->setText("");
    pushButton->setToolTip(QString(channel.c_str()));
    pushButton->setCheckable(true);
    pushButton->setChecked(false);
    connect(pushButton, SIGNAL(clicked()), this, SLOT(switchTab(channel)));
}
Run Code Online (Sandbox Code Playgroud)

(activePanelContents是一个保存列表的QWidget.)

关键是每个按钮应该switchTab(string& tabname)在单击时调用方法,包括特定通道的名称作为变量.这个实现虽然不起作用,但我还没有找到如何正确地做到这一点.

Dan*_*her 7

对于字符串和整数,您可以使用QSignalMapper.在您的Messenger课程中,您将添加一个QSignalMapper mapper对象,您的函数将如下所示:

void Messenger::addToActivePanels(std::string& channel)
{
    activePanelsContents = this->findChild<QWidget *>(QString("activePanelsContents"));
    pushButton = new QPushButton(activePanelsContents);
    // ...
    connect(pushButton, SIGNAL(clicked()), &mapper, SLOT(map()));
    mapper.setMapping(pushButton, QString(channel.c_str()));
}
Run Code Online (Sandbox Code Playgroud)

将所有频道添加到活动面板后,即可致电

connect(&mapper, SIGNAL(mapped(const QString &)), this, SLOT(switchTab(const QString &)));
Run Code Online (Sandbox Code Playgroud)


spb*_*ots 0

您可以尝试让您的switchTab插槽不带参数并用于QObject::sender获取发送信号的对象。

Messenger::switchTab()
{
  QObject* sender = this->sender();
  QPushButton* button = qobject_cast<QPushButton*>(sender);
  if(button)
  {
    // Do stuff...
  }
}
Run Code Online (Sandbox Code Playgroud)