【问题标题】:Qt signal slot visual studio: doesn't seem to be connectedQt信号槽视觉工作室:似乎没有连接
【发布时间】:2017-03-15 16:05:01
【问题描述】:

我正在学习如何在 Visual Studio 中使用 QT。目前,我正在使用 QT 5.8 和 vs 2017。我创建了一个新项目并使用 QT 设计器添加了一些单选按钮。现在,我想实现一些操作,例如“单击单选按钮时执行此操作”。这是我的代码:

绘制.cpp

#include "Draw.h"

#include "qpushbutton.h"
#include "qradiobutton.h"
#include "qgroupbox.h"

Draw::Draw(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);

    //Invisible elements
    ui.frmAbsolut->setVisible(false);

    //We create the connections to methods
    connect(this->ui.myradiobutton1, SIGNAL(toggled(bool)), this, SLOT(on_rdbMethod_change(this->ui.myradiobutton1->isChecked, 0)));

}

void Draw::on_rdbMethod_change(bool value, int option)
{
    //0: frmAbsolut
    printf("%d \n", option);
    if (value == true){
        if (option == 0) {
            this->ui.frmAbsolut->setVisible(true);
        }
    }
}

画.h

#pragma once

#include <QtWidgets/QMainWindow>
#include "ui_Draw.h"

class Draw: public QMainWindow
{
    Q_OBJECT

public:
    Draw(QWidget *parent = Q_NULLPTR);

private:
    Ui::DrawClass ui;

protected slots:
    void on_rdbMethod_change(bool, int);

};

如果我运行程序,我不会收到任何错误,如果我检查 connect(...) 行,我会看到它被调用,但是当我单击该单选按钮时,它不会调用我的方法。这有什么问题?

【问题讨论】:

    标签: c++ visual-studio qt


    【解决方案1】:
    connect(this->ui.myradiobutton1, SIGNAL(clicked), this, SLOT(on_rdbMethod_change(this->ui.myradiobutton1->isChecked, 0)));
    

    以上内容不正确——如果您查看程序的 stdout 输出,您可能会看到 connect() 正在打印有关它的错误消息。

    特别是,您在单击后没有包含括号,并且您的 slot-methods 参数必须与信号方法的参数相同,或者至少与信号方法的参数的前 N ​​个相同.在这种情况下,由于信号 (clicked()) 没有参数,这意味着您的插槽方法也需要没有参数;因此,您需要更改 on_rdbMethod_change() 以不接受任何参数,或者指定不同的插槽方法(也许可以实现插槽方法以调用 on_rdbMethod_change(this->ui.myradiobutton1->isChecked, 0),如果这就是你想要它做的)。此外,connect() 调用不能在其 SIGNAL/slot 参数列表中获取值,只能获取类型。

    所以正确的 connect() 调用看起来像这样:

    connect(this->ui.myradiobutton1, SIGNAL(clicked()), this, SLOT(on_rdbMethod_change()));
    

    【讨论】:

    • 那么如果我将不同的单选按钮连接到这个插槽,我如何从 on_rdbMethod_change 中知道它调用了哪个单选按钮?
    • 如果你在 slot 方法中调用 QObject::sender() (doc.qt.io/qt-5/qobject.html#sender),它将返回一个指向发出信号的 QObject 的指针。然后,您可以使用 dynamic_cast 将该指针向下转换为 QAbstractButton (或其他),并将其与 myradiobutton1 (或其他)进行比较以查看它是哪个按钮。 (请注意,这不被认为是一个好的面向对象设计,因为这意味着如果从其他上下文调用您的插槽可能不会做正确的事情;但实际上它可以工作)
    • 或者使用新的语法和 lambda,你可以忘记sender()、运行时错误和所有相关的烦恼。然后它就可以工作了。
    猜你喜欢
    • 1970-01-01
    • 2020-11-22
    • 2021-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-15
    • 1970-01-01
    相关资源
    最近更新 更多