Qt,信号和槽未连接?

3

我有一个qdialog,底部有一个buttonbox; 当“信号”发生时,为什么这个插槽没有被触发? 代码看起来像下面这样:

    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:在AskGUISupport.cpp:150中没有这样的信号QDialogButtonBox :: clicked(QPushButton *) 然而,这似乎非常奇怪,因为QDialogButtonBox确实有一个clicked信号?文档


ChoiceButtons 的类型是什么?另外,当连接失败时,Qt 会将警告打印到控制台/调试器中,这将非常有用。 - Lol4t0
@Lol4t0:这个错误弹出了 Object::connect: No such signal QDialogButtonBox::clicked(QPushButton*) in AskGUISupport.cpp:150 - 但是Qt手册确实说明clicked是一个信号? - paul23
为什么不直接将QPushButton clicked()信号连接到您的槽上?您不能为ButtonBox类(这是Qt小部件类吗?)定义自己的自定义信号,并期望事件循环知道此信号并自动触发它。 - ksming
3个回答

2

不要在connect中使用变量名:

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

1

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


0

QDialogButtonBox类没有信号

clicked(QPushButton*)

它有clicked ( QAbstractButton*)

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

您应该使用clicked (QAbstractButton*)签名,并调整您的槽以接受QAbstractButton*。创建一个槽

void OnClick(QAbstractButton* b);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接