关于C#:qt,信号插槽没有连接?

qt, signal slots not connecting?

我有一个qdialog,底部有一个按钮框;为什么在出现"信号"时没有触发此插槽?该代码如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
    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是一个按钮框)。模态对话框正确显示-但是似乎根本没有交互。按下按钮不会触发事件。插槽的声明如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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
但是,这似乎完全奇怪,因为QDialogBu??ttonBox确实有点击信号?文档


请勿在connect中使用变量名:

1
2
QObject::connect(box->ui.ChoiceButtons, SIGNAL(clicked(QPushButton*)),
                 box.get(), SLOT(OnClick(QPushButton*)));

QDialogBu??ttonBox有一个信号clicked ( QAbstractButton * button ),因此您需要定义一个插槽void OnClick(QAbstractButton* b)并连接到它。使用QAbstractButton,而不是QPushButton。


QDialogButtonBox类没有信号

clicked(QPushButton*)

已安装clicked ( QAbstractButton*)

使用信号/插槽机制时,签名时应非常精确。不允许进行任何强制类型转换,因为Qt在内部使用字符串检查签名。

您应该使用clicked (QAbstractButton*)签名并调整插槽以适应QAbstractButton*。插槽

1
void OnClick(QAbstractButton* b);