Qt之Q_PROPERTY

Q_PROPERTY

     Q_PROPERTY()是个宏。用来在一个类中声明一个属性property,该宏是qt特有的,需moc进行编译,必须继承QObject类。
     该Qt宏多用于QML、QtScript、Designer插件等场景。

     原型:

Q_PROPERTY
(
	type name
  	READ getFunction
   	[WRITE setFunction]
   	[RESET resetFunction]
   	[NOTIFY notifySignal]
   	[DESIGNABLE bool]
   	[SCRIPTABLE bool]
   	[STORED bool]
   	[USER bool]
   	[CONSTANT]
   	[FINAL]
)

   举例
      Q_PROPERTY(double minValue READ getMinValue WRITE setMinValue)
      Q_PROPERTY(bool maxValue READ getMaxValue WRITE setMaxValue )

READ访问器函数
     用于读属性的值,并且它是必须的。理想情况下,有一个不变的函数用于此目的,并且它必须返回属性的类型的值或指针或引用。

WRITE访问器函数
     用于设置属性的值。它必须返回空并且至少具有一个参数,参数是属性类型的值或指针或引用。

RESET函数
     用于设置属性的值到它的默认值。RESET函数必须返回void并且不带有任何参数。

NOTIFY信号
     如果被定义了,信号将在属性的值改变时发出。信号必须带有一个参数,这个参数的类型必须与属性相同;参数保存的是属性的新值。

DESIGNABLE变量
     表明此属性是否在界面设计器的属性编辑器中出现。大多数属性是可见的,除了为这个变量传入true或false,你还可以指定一个bool型的成员函数。

SCRIPTABLE变量
     表明这个属性是否可以被一个脚本引擎操作(默认是true)。你也可以赋予它true或false或bool型函数。

STORED变量
     表明了属性是否被认为是独立存在还是依赖于其它的值而存在。它也表明是否在保存对象状态时保存此属性的值。

USER变量
     表明属性是否被设计为面向用户的或用户可修改的类属性。通常,每个类只有一个USER属性。(是否用户自定义类型)。

CONSTANT
     它出现表明属性的值是不变的。对于一个object实例,常量属性的READ方法在每次被调用时必须返回相同的值。此常量值可能在不同的object实例中不相同。一个常量属性不能具有WRITE方法或NOYIFY信号。

FINAL变量
     它出现表明属性不能被派生类所重写。有些情况下,这可以用于效率优化,但不是被moc强制的。

注:
     READ,WRITE和RESET函数都可以被继承。它们也可以是虚函数。当它们在被多重继承中被继承时,它们必须出现在第一个被继承的类中。

使用
// .h:
class MainWindow : public QMainWindow
{
    Q_OBJECT

    Q_PROPERTY(QString context READ getValue WRITE setValue NOTIFY contextChange)

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

protected:
    void setValue(const QString &);
    QString getValue();
signal:
	void contextChange(cont QString &);

public slots:
    void on_set_clicked();			// set按钮
    void on_get_clicked(); 		// get按钮
    void contextChange(cont QString &);

private:
    Ui::MainWindow *ui;

    QString context;
};

// .cpp
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    connect(this,&MainWindow::contextChange,this,&MainWindow::contextChange);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::contextChange(cont QString &)
{
	ui->label->setText(property("context").toString());
}

void MainWindow::setValue(const QString &_context)
{
    context = _context;
}

QString MainWindow::getValue()
{
    return context;
}

void MainWindow::on_set_clicked()
{
    setProperty("context",ui->lineEdit->text());
    contextChange(context);
}

void MainWindow::on_get_clicked()
{
    ui->label->setText(property("context").toString());
}

     如代码,设置(setProperty)、获取(property)、信号(contextChange)属性。

关注

微信公众号搜索"Qt_io_"或"Qt开发者中心"了解更多关于Qt、C++开发知识.。

笔者 - jxd

发布了43 篇原创文章 · 获赞 0 · 访问量 3009

猜你喜欢

转载自blog.csdn.net/automoblie0/article/details/101348510