我是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);