我有一个qdialog,底部有一个按钮盒;当“信号”出现时,为什么这个插槽不会被触发?代码如下所示:
std::unique_ptr<MW::GenStd> box(new MW::GenStd(&tOut, &tIn));
box->ui.ChoiceButtons->addButton ("Ask",
QDialogButtonBox::AcceptRole );
box->ui.ChoiceButtons->addButton ("OverWrite",
QDialogButtonBox::AcceptRole );
box->ui.ChoiceButtons->addButton ("merge",
QDialogButtonBox::AcceptRole );
box->ui.ChoiceButtons->addButton ("Skip",
QDialogButtonBox::RejectRole );
QObject::connect(box->ui.ChoiceButtons, SIGNAL(clicked(QPushButton* b)), box.get(), SLOT(OnClick(QPushButton* b)));
return box->exec();
MW :: GenStd是一个对话框(和ui.ChoicButtons一个按钮框)。模态对话框正确显示 - 但它似乎根本没有交互。按下按钮不会触发事件。槽的声明如下:
public slots:
void OnClick(QPushButton* b) {
auto s(b->text());
if (s == "Merge") {
setResult(2);
} else if (s == "Overwrite") {
setResult(1);
} else if (s == "Skip") {
setResult(0);
} else if (s == "Ask") {
setResult(3);
}
}
};
(我知道在这里进行这样的字符串比较非常糟糕,但它只是作为验证按钮的快速模拟测试)。但调试显示该功能尚未到达!
编辑:正如建议看输出显示罪魁祸首:
Object::connect: No such signal QDialogButtonBox::clicked(QPushButton*) in AskGUISupport.cpp:150
然而,由于QDialogButtonBox确实有点击信号,这似乎很奇怪? documentation
答案 0 :(得分:2)
不要在连接中使用变量名称:
QObject::connect(box->ui.ChoiceButtons, SIGNAL(clicked(QPushButton*)),
box.get(), SLOT(OnClick(QPushButton*)));
答案 1 :(得分:1)
QDialogButtonBox的信号为clicked ( QAbstractButton * button )
,因此您需要定义一个插槽void OnClick(QAbstractButton* b)
并连接到它。使用QAbstractButton,而不是QPushButton。
答案 2 :(得分:0)
QDialogButtonBox
类没有信号
clicked(QPushButton*)
。
它已经clicked ( QAbstractButton*)
了。
使用信号/插槽机制时,您应该非常精确地签名。任何强制转换都是不允许的,因为Qt
在内部使用字符串来检查签名。
您应该使用clicked (QAbstractButton*)
签名并将广告位调整为QAbstractButton*
。制作一个插槽
void OnClick(QAbstractButton* b);