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)
在单击时调用方法,包括特定通道的名称作为变量.这个实现虽然不起作用,但我还没有找到如何正确地做到这一点.
对于字符串和整数,您可以使用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)
您可以尝试让您的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)