【问题标题】:qt, signal slots not connecting?qt,信号槽没有连接?
【发布时间】:2012-02-21 15:40:45
【问题描述】:

我有一个 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

【问题讨论】:

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

标签: c++ qt signals


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      QDialogButtonBox 类没有信号

      clicked(QPushButton*)

      已安装 clicked ( QAbstractButton*)

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

      您应该使用clicked (QAbstractButton*) 签名并将您的插槽调整为接受QAbstractButton*。做个槽

      void OnClick(QAbstractButton* b);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-10-15
        • 1970-01-01
        • 2015-03-14
        • 2016-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多