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