理解了信号与槽的通信机制后,传递的值为类对象时,我们该如何做呢?
就一点: 类声明需要添加Q_PROPERTY()宏, 一般有四个参数,NAME READ WRITE NOTIFY,第一个为变量,后面三个为函数。 NAME READ是必须有的。
其余用法跟传递值时一样,需要在 MainWindow .h中定义slots:函数 MainWindow .cpp中实现slots:函数和connect函数。
1.Q_PROPERTY()定义
- Q_PROPERTY(type name
- READ getFunction //属性名
- [WRITE setFunction] //读函数
- [RESET resetFunction] //属性设置成其默认状态
- [NOTIFY notifySignal] //触发信号
- [DESIGNABLE bool] //是否能在界面设计器的编辑器(QT Designer)中出现
- [SCRIPTABLE bool] //是否可以被脚本引擎(Script engine)操作
- [STORED bool] //是否独立存在
- [USER bool] //是否被用户更改
- [CONSTANT] //属性的值不变
- [FINAL]) //不能被派生类重写
实例代码
myclass.h
#ifndef MYCLASS_H
#define MYCLASS_H
#include <QObject>
class MyClass : public QObject
{
Q_OBJECT
Q_PROPERTY(QString userName READ getUserName WRITE setUserName
NOTIFY userNameChanged) // 注册属性userName
public:
explicit MyClass(QObject *parent = 0);
// 实现READ读函数
QString getUserName() const {return m_userName;}
// 实现WRITE写函数
void setUserName(QString userName)
{
m_userName = userName;
emit userNameChanged(userName); // 当属性值改变时发射该信号
}
// 声明NOTIFY通知消息
signals:
void userNameChanged(QString);
// 私有变量,存放userName属性的值
private:
QString m_userName;
};
#endif // MYCLASS_H
myclass.cpp
#include "myclass.h"
MyClass::MyClass(QObject *parent) : QObject(parent)
{
}
MainWindow .h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
namespace Ui {
class MainWindow;
}
class MainWindow: public QWidget
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow*ui;
private slots:
void userChanged(QString);
};
#endif // MAINWINDOW_H
MainWindow .cpp
#include "MainWindow.h"
#include "ui_MainWindow.h"
#include "myclass.h"
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
MyClass *my = new MyClass(this); // 创建MyClass类实例
connect(my, &MyClass::userNameChanged, this, &Widget::userChanged);
my->setUserName("yafei"); // 设置属性的值
qDebug() << "userName1:" << my->getUserName(); // 输出属性的值
// 使用QObject类的setProperty()函数设置属性的值
my->setProperty("userName", "linux");
// 输出属性的值,这里使用了QObject类的property()函数,它返回值类型为QVariant
qDebug() << "userName2:" << my->property("userName").toString();
my->setProperty("myValue", 10); // 动态属性,只对该实例有效
qDebug() << "myValue:" << my->property("myValue").toInt();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::userChanged(QString userName)
{
qDebug() << "user changed:" << userName;
}