通过信号和插槽系统调用类功能

时间:2015-02-13 13:09:02

标签: c++ qt

我是Qt的新手,所以我的问题可能微不足道。但是我找不到合适的答案,或者我没有真正了解信号和放大器的想法。槽。

我有一个带有四个单选按钮的MainWindow和一个没有GUI表示的“数据”类。我正在尝试实现的是在选中单选按钮时在类中设置一些属性。

这是我的课程标题:

#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

3 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:1)

数据在头文件中的含义是什么?当您需要将指针传递给Data时,看起来您正在将指针传递给指向Data的指针。

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

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

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

答案 2 :(得分:0)

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

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

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

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