QT(3)-信号与槽-单值传输-类对象-示例源码

本文详细介绍了在Qt中如何通过Q_PROPERTY宏定义类属性,并利用信号与槽机制进行通信。文章展示了如何创建属性,实现读写函数,以及如何在属性值变化时触发信号。同时,通过实例代码演示了属性的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

   理解了信号与槽的通信机制后,传递的值为类对象时,我们该如何做呢?

   就一点:  类声明需要添加Q_PROPERTY()宏, 一般有四个参数,NAME  READ  WRITE    NOTIFY,第一个为变量,后面三个为函数。        NAME  READ是必须有的。

    其余用法跟传递值时一样,需要在 MainWindow .h中定义slots:函数     MainWindow .cpp中实现slots:函数和connect函数。


1.Q_PROPERTY()定义

 

  1. Q_PROPERTY(type name   
  2. READ  getFunction  //属性名  
  3. [WRITE setFunction] //读函数  
  4. [RESET resetFunction]  //属性设置成其默认状态      
  5. [NOTIFY notifySignal]   //触发信号
  6. [DESIGNABLE bool]   //是否能在界面设计器的编辑器(QT Designer)中出现
  7. [SCRIPTABLE bool]  //是否可以被脚本引擎(Script engine)操作 
  8. [STORED bool]   //是否独立存在
  9. [USER bool]   //是否被用户更改
  10. [CONSTANT]   //属性的值不变
  11. [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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值