C++ qt,信号插槽未连接?
我有一个qdialog,底部有一个按钮盒;为什么当“信号”出现时,这个插槽没有被触发?代码如下所示:C++ qt,信号插槽未连接?,c++,qt,signals,C++,Qt,Signals,我有一个qdialog,底部有一个按钮盒;为什么当“信号”出现时,这个插槽没有被触发?代码如下所示: std::unique_ptr<MW::GenStd> box(new MW::GenStd(&tOut, &tIn)); box->ui.ChoiceButtons->addButton ("Ask", QDialogButtonBox::AcceptRole ); box->ui.ChoiceButtons
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();
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:没有这样的信号QDialogButtonBox::在AskGUISupport.cpp:150中单击(QPushButton*)
然而,这似乎完全奇怪,因为QDialogButtonBox确实有一个点击信号 不要在connect中使用变量名:
QObject::connect(box->ui.ChoiceButtons, SIGNAL(clicked(QPushButton*)),
box.get(), SLOT(OnClick(QPushButton*)));
QDialogButtonBox有一个单击的信号(QAbstractButton*button),因此您需要定义一个插槽
void OnClick(QAbstractButton*b)
,并连接到它。使用QAbstractButton,而不是QPushButton。QDialogButtonBox
类没有信号
单击(QPushButton*)
它取代了
在使用信号/插槽机制时,签名应该非常精确。不允许任何强制转换,因为Qt
在内部使用字符串检查签名
您应该使用clicked(QAbstractButton*)
签名并将插槽调整为accpetQAbstractButton*
。开槽
void OnClick(QAbstractButton* b);
选择按钮的类型是什么?另外,当连接失败时,Qt
向控制台/调试器打印警告,这将非常有用。@Lol4t0:这个错误会弹出Object::connect:没有这样的信号QDialogButtonBox::clicked(QPushButton*)在AskGUISupport.cpp:150中-但是qt手动实际表示单击是一个信号?为什么不将QPushButton clicked()信号直接连接到插槽?您不能为ButtonBox类(这是Qt小部件类吗?)定义自己的自定义信号,并期望事件循环知道该信号并自动触发它。