【发布时间】:2016-01-15 07:57:43
【问题描述】:
两天来,我一直在试图理解为什么我的应用程序上的同一个按钮会调用不同的插槽。我已经用谷歌搜索了很多关于这个主题的内容,但主要是I found 是关于一个独特的 SLOT 被同一个按钮多次调用,这解决了在连接调用上添加第五个参数Qt::UniqueConnection
即:
connect(obj, SIGNAL(signal()), obj2, SLOT(slot()), Qt::UniqueConnection);
继续,我的问题是同一个按钮在不应该调用不同的插槽时。我创建了一个通用代码来设置我的所有按钮:
void KHUB::btSetupInt(QPushButton **button, const QString name, int posX, int posY, int width, int height, void (KHUB::*fptr)(int parameter), int value, int handler) {
*button = new QPushButton(name, this);
(*button)->setGeometry(QRect(QPoint(posX, posY), QSize(width, height)));
signalMapper->setMapping(*button, value);
connect(*button, SIGNAL(clicked()), signalMapper, SLOT(map()));
//qDebug() << "My value: " + QString::number(value);
switch (handler) {
case (int) ButtonHandler::hl_Register:
connect(signalMapper, SIGNAL(mapped(int)), this, SLOT(handleRegister(int)), Qt::UniqueConnection);
break;
case (int)ButtonHandler::hl_UpVote:
connect(signalMapper, SIGNAL(mapped(int)), this, SLOT(handleUpVote(int)), Qt::UniqueConnection);
break;
case (int) ButtonHandler::hl_OpenUrl:
//connect(signalMapper, SIGNAL(mapped(int)), this, SLOT(handleUrl(int)), Qt::UniqueConnection);
break;
case (int)ButtonHandler::hl_DownVote:
connect(signalMapper, SIGNAL(mapped(int)), this, SLOT(handleDownVote(int)), Qt::UniqueConnection);
break;
case (int) ButtonHandler::hl_DisposeBrowser:
connect(signalMapper, SIGNAL(mapped(int)), this, SLOT(handleDispose(int)), Qt::UniqueConnection);
break;
}
}
在其中我有我的signalMapper,它在我的头文件中声明。此按钮设置的调用者为:
void KHUB::handleSearch() {
//DO THE MATH
for (int pos = 0; pos < localUrl.size(); pos++){
QLabel *link = new QLabel();
link->setText("<a href=\"" + localUrl.at(pos) + "\">" + localUrl.at(pos) + "</a>");
link->setTextFormat(Qt::RichText);
link->setTextInteractionFlags(Qt::TextBrowserInteraction);
link->setOpenExternalLinks(true);
QPushButton *upArrow = new QPushButton();
btSetupInt(&upArrow, "Up Vote", 225, 300, 100, 25, &KHUB::handleUpVote, pos*147, (int)ButtonHandler::hl_UpVote);
QPushButton *open = new QPushButton("Open");
//btSetupInt(&open, "Open", 225, 300, 100, 25, &KHUB::handleUrl, pos, (int) ButtonHandler::hl_OpenUrl);
QPushButton *downArrow = new QPushButton();
btSetupInt(&downArrow, "Down Vote", 225, 300, 100, 25, &KHUB::handleDownVote, pos*163, (int)ButtonHandler::hl_DownVote);
QLabel *separator = new QLabel();
QLabel *guider = new QLabel("<----------------------------------------------------------------------------------------------------------------------------------------------------->");
gridLayout->addWidget(link, componentsPos, 0, 1, -1);
gridLayout->addWidget(guider, componentsPos, 1, 1, -1);
gridLayout->addWidget(upArrow, componentsPos - 1, 2, 1, 1, Qt::AlignBottom);
gridLayout->addWidget(open, componentsPos, 2, 1, 1);
gridLayout->addWidget(downArrow, componentsPos + 1, 2, 1, 1, Qt::AlignTop);
gridLayout->addWidget(separator, componentsPos + 2, 1, 1, 1);
componentsPos = componentsPos + 5;
}
//KEEP DOING THE MATH
}
注释行用于调试目的。无论如何,当我只有open QPushButton 时,这段代码完全可以工作。当添加upVote 和downVote 时,我希望程序能够复制其逻辑成功,相反,现在当我单击“向上投票”或“向下投票”时,程序会触发处理向上和向下投票的两个插槽,如果没有评论,还会触发“打开” .处理赞成票和反对票的代码:
void KHUB::handleUpVote(int reference) {
qDebug() << "This is my reference for upvoting: " + QString::number(reference/147);
}
void KHUB::handleDownVote(int reference) {
qDebug() << "This is my reference for DOWNVOTING: " + QString::number(reference/163);
}
根据Qt QSignalMapper documentation(页面结尾处的主题“高级信号和插槽使用”)我正在按预期做所有事情。你也一定注意到我成倍增加
pos btSetupInt 自 every button must have its only integer ID 起通过 147 和 163 调用(生成“随机”数字)[请参阅 setMapping 获取整数 void QSignalMapper::setMapping(QObject * sender, int id)]。
几天前,我对它们中的三个(按钮)使用相同的位置 (pos),无论相乘与否,产生的结果是否相等。 这引出了我的第一个问题: 这个 ID 是每个按钮的唯一标识符还是按钮可以传递的唯一参数?我还是没明白考虑到我上面给出的上下文
这是我的用户界面:
这是我在us.battle.net/wow/en/blog/19913791/patch-623-preview-10-14-2015 上单击(选择随机链接)投票的输出:
"This is my reference for upvoting: 3"
"This is my reference for DOWNVOTING: 3"
这是我在http://www.swtor.com/holonet/companions/blizz 上单击(选择随机链接)Down Vote 的输出:
"This is my reference for upvoting: 6"
"This is my reference for DOWNVOTING: 6"
我使用断点查看btSetupInt 处的handler 开关是否被正确调用,并且是正确的。即使不使用我的成员函数btSetupInt 来调用连接,我仍然会得到相同的错误结果。 最后,我的第二个也是主要问题:在给定的上下文中,同一个按钮怎么可能调用不同的插槽?我在这里错过了什么?
【问题讨论】:
-
在将信号连接到新插槽之前,您需要将其与前一个插槽断开。然后一切都会正常工作。
-
请启发我,我明白你的意思,但完全没有这个想法——我该怎么做?快速谷歌研究会在我的切换结束时类似于
button->disconnect(SIGNAL(signal))?
标签: qt signals call signals-slots slots