Qt每天一个小技巧之 Q_PROPERTY 的使用
The Property System
在属性系统中,Qt提供了一个复杂的属性系统,与一些编译器供应商提供的类似。 然而,作为一个独立于编译器和平台的库,Qt不依赖于非标准的编译器特性,如__property或[property]。 Qt解决方案适用于Qt支持的每个平台上的任何标准c++编译器。 它基于元对象系统,元对象系统也通过信号和插槽提供对象间通信。
官方给的格式:
Q_PROPERTY(type name(READ getFunction [WRITE setFunction] |MEMBER memberName [(READ getFunction | WRITE setFunction)])[RESET resetFunction][NOTIFY notifySignal][REVISION int][DESIGNABLE bool][SCRIPTABLE bool][STORED bool][USER bool][CONSTANT][FINAL])
然后官方给的简单的例子:
Q_PROPERTY(QColor color MEMBER m_color NOTIFY colorChanged)Q_PROPERTY(qreal spacing MEMBER m_spacing NOTIFY spacingChanged)Q_PROPERTY(QString text MEMBER m_text NOTIFY textChanged)...signals:void colorChanged();void spacingChanged();void textChanged(const QString &newText);private:QColor m_color;qreal m_spacing;QString m_text;
官方给的对应属性:
- 如果没有指定MEMBER变量,则需要一个READ访问器函数。 它用于读取属性值。 理想情况下,const函数用于此目的,它必须返回属性的类型或对该类型的const引用。 例如,QWidget::focus是一个READ函数的只读属性,QWidget::hasFocus()。
- 一个可选的WRITE访问器函数。它用于设置属性的值。它必须返回空并且至少具有一个参数,参数是属性类型的值或指针或引用。例如:QWidget::enabled具有WRITE函数QWidget::setEnable()。只读属性不需要写函数。例如,QWidget::focus没有对应的写函数。
- 一个可选的RESET函数。用于设置属性的值到它的默认值。例如:QWidget::cursor具有典型的READ和WRITE函数,QWidget::cursor()和QWidget::setCursor(),并且它也具有一个RESET函数,QWidget::unsetCursor()。RESET函数必须返回void并且不带有任何参数。
- 一个可选的NOTIFY信号。如果被定义了,信号将在属性的值改变时发出。信号必须带有一个参数,这个参数的类型必须与属性相同;参数保存的是属性的新值。
- 一个DESIGNABLE变量表明此属性是否在界面设计器的属性编辑器中出现。大多数属性是可见的,除了为这个变量传入true或false,你还可以指定一个bool型的成员函数。
SCRIPTABLE变量表明这个属性是否可以被一个脚本引擎操作(默认是true)。你也可以赋予它true或false或bool型函数。 - STORED变量表明了属性是否被认为是独立存在还是依赖于其它的值而存在。它也表明是否在保存对象状态时保存此属性的值。大多数属性都是需要保存的,但是,如QWidget::minimumWidth()就是不被保存的,因为它的值是从另一个属性QWidget::minimumSize()得来的。
- USER变量表明属性是否被设计为面向用户的或用户可修改的类属性。通常,每个类只有一个USER属性。例如,QAbstractButton::checked是按钮类的用户可修改属性。注意QItemDelegate获取和设置widget的USER属性。
- CONSTANT的出现表明属性的值是不变的。对于一个object实例,常量属性的READ方法在每次被调用时必须返回相同的值。此常量值可能在不同的object实例中不相同。一个常量属性不能具有WRITE方法或NOYIFY信号。
- FINAL变量的出现表明属性不能被派生类所重写。有些情况下,这可以用于效率优化,但不是被moc强制的。程序员必须永远注意不能重写一个FINAL属性。
例子:
/*
1.本例子为比卡求不皮 基本*/#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include namespace Ui {
class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTQ_PROPERTY(Priority priority READ priority WRITE setPriority NOTIFY priorityChanged)public:explicit MainWindow(QWidget *parent = nullptr);~MainWindow();enum Priority{ High, Low, VeryHigh, VeryLow };Q_ENUM(Priority)void setPriority(Priority priority){m_priority = priority;emit priorityChanged(priority);}Priority priority() const //这里必须加载const{ return m_priority; }signals:void priorityChanged(Priority);
private:Ui::MainWindow *ui;Priority m_priority;
};#endif // MAINWINDOW_H
main.cpp
#include "mainwindow.h"
#include
#include
int main(int argc, char *argv[])
{QApplication a(argc, argv);MainWindow w; QObject * pro =&w;pro->setProperty("priority","VeryHigh");qDebug() << pro->property("priority") <
运行结果:
QVariant(int, 2) MainWindow::High
这个经常使用在qml 中,可以看着这个例子的使用
Qt Quick C++与QML混合编程_比卡丘不皮的博客-CSDN博客声明:本例子是Qt Quick核心编程中的一个小例子,有关混合编程的方式。有关详细编程,请查看对应书籍。话不多说看效果图:首先我们创建的是一个QtquickApp,工程名字为colorMaker项目,然后我们添加ColorMaker类:colorMaker.h#ifndef COLORMAKER_H#define COLORMAKER_H#include https://blog.csdn.net/weixin_42126427/article/details/118896474
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
