首页 > 其他分享 >Qt Core

Qt Core

时间:2023-06-19 17:12:14浏览次数:56  
标签:Core Qt READ QObject priority QWidget PROPERTY 属性

Qt核心模块将这些特性添加到c++中:

The Meta-Object System

Qt的元对象系统为对象间通信、运行时类型信息和动态属性系统提供了信号和插槽机制。
元对象系统基于以下三点:

  1. QObject类为可以利用元对象系统的对象提供了一个基类。
  2. 类声明的私有部分中的Q_OBJECT宏用于启用元对象特性,例如动态属性、信号和槽。
  3. 元对象编译器(moc)为每个QObject子类提供实现元对象特性所需的代码。

QMetaObject *QObject::metaObject()

className():

QObject *obj = new QPushButton;
obj->metaObject()->className();             // returns "QPushButton"

QPushButton::staticMetaObject.className();  // returns "QPushButton"

inherits():

QTimer *timer = new QTimer;         // QTimer inherits QObject
timer->inherits("QTimer");          // returns true
timer->inherits("QObject");         // returns true
timer->inherits("QAbstractButton"); // returns false

// QVBoxLayout inherits QObject and QLayoutItem
QVBoxLayout *layout = new QVBoxLayout;
layout->inherits("QObject");        // returns true
layout->inherits("QLayoutItem");    // returns true (even though QLayoutItem is not a QObject)

qobject_cast():

QObject *obj = new MyWidget;
QWidget *widget = qobject_cast<QWidget *>(obj);
MyWidget *myWidget = qobject_cast<MyWidget *>(obj);
QLabel *label = qobject_cast<QLabel *>(obj);
    // label is 0

The Property System

要声明一个属性,在继承QObject的类中使用Q_PROPERTY()宏。
下面是取自类QWidget的属性声明的一些典型示例:

Q_PROPERTY(bool focus READ hasFocus)
Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled)
Q_PROPERTY(QCursor cursor READ cursor WRITE setCursor RESET unsetCursor)

下面是一个示例,展示了如何使用member关键字将成员变量导出为Qt属性。注意,必须指定NOTIFY信号才能允许QML属性绑定。

    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;

accessor function:
READ 如果没有指定成员变量,则需要READ访问器函数。它用于读取属性值。理想情况下,为此目的使用const函数,它必须返回属性的类型或对该类型的const引用。
WRITE 访问器函数是可选的。用于设置属性值。它必须返回void,并且必须只有一个参数,要么是属性的类型,要么是指向该类型的指针或引用。例如,QWidget::enabled具有WRITE功能QWidget::setEnabled()。只读属性不需要WRITE函数。
MEMBER 给定的成员变量可读可写,而不需要创建READ和WRITE访问器函数。如果需要控制变量访问,除了成员变量关联之外,还可以使用READ或WRITE访问器函数(但不能两者都使用)。
RESET 是可选的,它用于将属性设置回其上下文特定的默认值。例如,QWidget::cursor具有典型的READ和WRITE函数,QWidget::cursor()和QWidget::setCursor(),并且它还有一个RESET函数,QWidget::unsetCursor(),因为没有调用QWidget::setCursor()可以意味着重置到特定于上下文的光标。RESET函数必须返回void且不带参数。
NOTIFY 信号方法是可选的. 它需要在该类中指定一个现有的信号,每当属性的值发生变化时,该信号就会发出。

QObject::property() and QObject::setProperty() QMetaProperties

QPushButton *button = new QPushButton;
QObject *object = button;

button->setDown(true);
object->setProperty("down", true);

button->setProperty("flat",true);
QVariant isflat = button->property("flat");
qDebug() << isflat << endl;//QVariant(bool, true)
QObject *object = ...
const QMetaObject *metaobject = object->metaObject();
int count = metaobject->propertyCount();
for (int i=0; i<count; ++i) {
    QMetaProperty metaproperty = metaobject->property(i);
    const char *name = metaproperty.name();
    QVariant value = object->property(name);
    ...
}

A Simple Example:

class MyClass : public QObject
{
    Q_OBJECT
    Q_PROPERTY(Priority priority READ priority WRITE setPriority NOTIFY priorityChanged)

public:
    MyClass(QObject *parent = nullptr);
    ~MyClass();

    enum Priority { High, Low, VeryHigh, VeryLow };
    Q_ENUM(Priority)

    void setPriority(Priority priority)
    {
        m_priority = priority;
        emit priorityChanged(priority);
    }
    Priority priority() const
    { return m_priority; }

signals:
    void priorityChanged(Priority);

private:
    Priority m_priority;
};

有两种方法设置属性

MyClass *myinstance = new MyClass;
QObject *object = myinstance;

myinstance->setPriority(MyClass::VeryHigh);
object->setProperty("priority", "VeryHigh");

QObject::setProperty()也可用于在运行时为类的实例添加新属性。当使用名称和值调用它时,如果QObject中存在具有给定名称的属性,并且给定的值与属性的类型兼容,则该值将存储在属性中,并返回true。如果该值与属性的类型不兼容,则不会更改属性,并返回false。但是,如果具有给定名称的属性在QObject中不存在(即,如果它没有使用Q_PROPERTY()声明),则一个具有给定名称和值的新属性将自动添加到QObject中,但仍然返回false。这意味着不能使用返回false来确定是否实际设置了特定属性,除非您事先知道该属性已经存在于QObject中。

参考连接:
https://doc.qt.io/qt-6/qtcore-index.html

标签:Core,Qt,READ,QObject,priority,QWidget,PROPERTY,属性
From: https://www.cnblogs.com/yg1990/p/17491589.html

相关文章

  • QT sqlite 使用
    非常适合QT本地的数据落地,基本语法和oraclemysql有一定的差异,建议本地安装sqlite客户端,一边操作,一边开发下载页:http://www.sqlite.org/download.html1。删除数据deletefromin_store_code;2.  删除表droptablein_store_code;3。创建表 createtablein_store_co......
  • Oracle服务端和客户端版本补丁不一致造成Tuxedo应用程序出core案例
    这是一个CU**系统调用的查询天气预报的Tuxedo服务,OraclePro*C程序,连接的是Oracle10.2.0.4库,出现问题的现象是不定时的产生core,服务down,触发Tuxedo服务的自动重启机制,但一般MAXGEN配置是100,即1天内若重启100次后服务就不会自动重启了,只能人工干预,每次重启后会好一阵,且该服务已经由......
  • 关于ASP.NET.CORE中的Failed to read parameter "string param" from the request bod
    先上报错信息Microsoft.AspNetCore.Http.BadHttpRequestException:Failedtoreadparameter"stringparam"fromtherequestbodyasJSON.--->System.Text.Json.JsonException:'s'isaninvalidstartofavalue.Path:$|LineNumber:0|By......
  • Qt的QFile_Size实现调试
    背景c++qt需要获取一系列日志的大小,不想和底层C接口打交道,同时想看看QT的实现,是如何完成的?源码查看首先通过qtcreator的帮助知道,QFile::size()是基类QFileDevice::size()实现,然后找到Qt5.9.7的源码,qtbase\include\QtCore\qfiledevice.h,索引到src/corelib/io/qfiledevice.h......
  • 官方core-ktx库能对富文本Span开发带来哪些便利?
    这是一个系列文章,专门研究Android官方提供的core-ktx库里面的扩展类、方法等等,看看能为项目开发带来哪些便利。已更新的文章列表如下:你需要了解的官方core-ktx库能对开发带来哪些便利1官方core-ktx库能对SparseArray系列、Pair开发带来哪些便利?接下来,本篇文章就带你看下富文本开发......
  • ASP.NET Core 6框架揭秘实例演示[39]:使用最简洁的代码实现登录、认证和注销
    认证是一个确定请求访问者真实身份的过程,与认证相关的还有其他两个基本操作——登录和注销。ASP.NETCore利用AuthenticationMiddleware中间件完成针对请求的认证,并提供了用于登录、注销以及“质询”的API,本篇文章利用它们使用最简单的代码实现这些功能。(本文提供的示例演示已经同......
  • .NET Core Web API 实现图形验证码
    https://blog.csdn.net/liwan09/article/details/126319320?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-1-126319320-blog-101289369.235%5Ev38%5Epc_relevant_sort_base2&depth_1-utm_......
  • Qt开发总结1
    GUI界面限制输入的内容QValidator*validator=newQIntValidator(100,999,this);//这样文本框只能输入100~999之间的数字ui->lineEdit->setValidator(validator);显示格式控制ui->textEdit->setWordWrapMode(QTextOption::WrapAnywhere);//任意地方换行ui->tableWi......
  • 2023-06-18:给定一个长度为N的一维数组scores, 代表0~N-1号员工的初始得分, scores[i] =
    2023-06-18:给定一个长度为N的一维数组scores,代表0~N-1号员工的初始得分,scores[i]=a,表示i号员工一开始得分是a,给定一个长度为M的二维数组operations,operations[i]={a,b,c}。表示第i号操作为:如果a==1,表示将目前分数<b的所有员工,分数改成b,c这个值无用,如果a==2,表示将......
  • 第三十节:EFCore7.x版本新功能总结
    一.linq改进1.GroupBy(1).可以直接GroupBy进行toList()输出了. PS:从EFCore3.x--6.x不能直接groupby进行输出了。(2).这种类型的GroupBy不会直接转换为SQL,因此EFCore对返回的结果进行分组。但是,这不会导致从服务器传输任何其他数据。toList()才会查询。(3).案......