qt,信号槽没有连接?

时间:2012-02-21 15:40:45

标签: 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->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 然而,由于QDialogBu​​ttonBox确实有点击信号,这似乎很奇怪? documentation

3 个答案:

答案 0 :(得分:2)

不要在连接中使用变量名称:

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

QDialogButtonBox类没有信号

clicked(QPushButton*)

它已经clicked ( QAbstractButton*)了。

使用信号/插槽机制时,您应该非常精确地签名。任何强制转换都是不允许的,因为Qt在内部使用字符串来检查签名。

您应该使用clicked (QAbstractButton*)签名并将广告位调整为QAbstractButton*。制作一个插槽

void OnClick(QAbstractButton* b);