通过信号和时隙系统调用类函数



我是Qt的新手,所以我的问题可能很琐碎。但我找不到合适的答案,或者可能我并没有真正理解信号&插槽。

我有一个带有四个单选按钮的MainWindow和一个没有GUI表示的类"Data"。我试图实现的是在选中单选按钮时在类中设置一些属性。

这是我的课堂标题:

#include <QObject>
class Data : public QObject
{
    Q_OBJECT
public:
    explicit Data(QObject *parent = 0);
    ~Data();
signals:
public slots:
    void setTextOrientation(int data);
private:
    int textOrientation;
};

以下是MainWindow:的构造函数

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    data = new Data();
    ui->setupUi(this);
    connect(ui->textOrientRB0, SIGNAL(toggled(true)), &data, SLOT(setTextOrientation(int)));
}

错误:

mainwindow.cpp:10: error: C2664: 'QMetaObject::Connection QObject::connect(const QObject *,const char *,const char *,Qt::ConnectionType) const' : cannot convert argument 3 from 'Data **' to 'const QObject *'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast

您将指针传递给了指针,而不是指针,这里是:

connect(ui->textOrientRB0, SIGNAL(toggled(true)), &data, SLOT(setTextOrientation(int)));

应该是:

connect(ui->textOrientRB0, SIGNAL(toggled(true)), data, SLOT(setTextOrientation(int)));

至少,这是编译器告诉你的。

头文件中的数据是什么样子的?当您需要将指针传递给Data时,它看起来就像是在传递一个指向Data的指针。

如果数据确实是data*类型,那么调用应该是

connect(ui->textOrientRB0, SIGNAL(toggled(true)), data, SLOT(setTextOrientation(int)));

需要查看头文件才能确定,但我认为这是基于它的初始化。

QObject::connect期望第三个参数是指向QObject的指针。在您的示例中,您将&data作为第三个参数传递。&data不是指向QObject的指针。它是指针对指针。只传递data。这应该可以解决编译错误。

可能会出现另一个运行时错误,因为toggled有一个类型为bool的参数,而setTextOrientation有一个型号为int的参数。

对于信号/插槽兼容性的编译器时间检查(connect的第二个和第四个参数的兼容性),您可以使用以下语法:

QObject::connect(ui->textOrientRB0, &QAbstractButton::toggled, data, &Data::setTextOrientation);

最新更新