兩天了,我一直在試圖理解爲什麼不同的插槽被我的應用程序上的同一個按鈕調用。我GOOGLE了很多有關的問題,但主要是什麼I found是關於一個獨特的SLOT被稱爲通過解決在連接調用 即增加第五個參數Qt::UniqueConnection
同一按鈕多次:同一個按鈕如何調用不同的插槽?
連接(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(主題「高級信號和槽的使用」,在頁面的結尾)我做的一切都如預期。您還必須注意到,自every button must have its only integer ID [請參閱集成void QSignalMapper::setMapping(QObject * sender, int id)
的setMapping],我乘以 pos
在btSetupInt
呼叫147和163(以產生「隨機」號碼)。
幾天前我對他們的三個按鈕(按鈕)使用了相同的位置(pos
),以及生成的結果是否相乘。 這導致我的第一個問題:此ID是每個按鈕的唯一標識符或可以通過按鈕傳遞的唯一參數?我還沒有得到這考慮到我上面
這給了上下文是我的UI:
這是我的輸出點擊(隨機鏈接choosen)最多投票在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"
這是我的輸出點擊(隨機鏈接choosen)向下投票在http://www.swtor.com/holonet/companions/blizz:
"This is my reference for upvoting: 6"
"This is my reference for DOWNVOTING: 6"
我用斷點來查看handler
開關btSetupInt
是否被正確調用,它是。即使不使用我的成員函數btSetupInt
來調用連接,我仍然得到相同的錯誤結果。 要完成,我的第二個主要問題:在給定的上下文中,甚至有可能同一個按鈕調用不同的插槽?我在這裏錯過了什麼?
在將信號連接到新插槽之前,您需要將其與前一個插槽斷開連接。然後一切都會正常工作。 – johngull
請賜教,我收到你的話,但沒有任何想法 - 我該怎麼做?在我的開關結束時,快速谷歌研究會像'button-> disconnect(SIGNAL(signal))'一樣? –