В течение двух дней я пытаюсь понять, почему разные слоты вызываются одной и той же кнопкой в моем приложении. Я гугле много о предмете, но в основном то, что I found был относительно уникального SLOT называют несколько раз по той же кнопке, которая решается при добавлении пятого параметра Qt::UniqueConnection
на подключения вызова т.е.Как разные слоты вызываются одной и той же кнопкой?
подключения (объект, СИГНАЛ (сигнал()), obj2, 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
Я ожидал, что программа реплицирует свой логический успех, вместо этого, теперь, когда я нажимаю кнопку «Вверх», вы пропустите голосование. Программа запускает оба слота для обработки Up и Down votin, а также «Open», если не прокомментировать. Код для обработки вверх и вниз Голосов:
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
называть 147 и 163 (для создания «случайного» номера) с every button must have its only integer ID [см. SetMapping для целых чисел void QSignalMapper::setMapping(QObject * sender, int id)
].
Дней тому назад я использовал ту же позицию (pos
) для трех из них (кнопок), и умножилось или нет произведенный результат. Это приводит меня к моему первому вопросу:Этот идентификатор является уникальным идентификатором для каждой кнопки или уникальным параметром, который может быть передан кнопкой? Я все еще не получил это, учитывая контекст, который я дал выше
Это мой UI:
Это мой выходной щелчок (случайная ссылка Выбирается) Up голосов на 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:
"This is my reference for upvoting: 6"
"This is my reference for DOWNVOTING: 6"
Я использовал точки останова, чтобы проверить, правильно ли вызывается переключатель handler
на btSetupInt
. Даже не используя мою функцию-член btSetupInt
для вызова соединений, я все равно получаю одинаковые неверные результаты. Чтобы закончить, мой второй и главный вопрос: Как возможно, в данном контексте, что одна и та же кнопка вызывает разные слоты? Что мне здесь не хватает?
перед подключением к новому разъему необходимо отсоединить его от предыдущего. Тогда все будет хорошо работать. – johngull
Просветите меня, пожалуйста, я получил ваши слова, но не знаю вообще. Как я должен это делать? Быстрое исследование google было бы чем-то вроде 'button-> disconnect (SIGNAL (signal))' в конце моего переключателя? –