日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

Qt C++属性类型提供给 QML调用(三)

發(fā)布時間:2025/1/21 c/c++ 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt C++属性类型提供给 QML调用(三) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言

前面兩篇文章已經(jīng)介紹了 QML 中如何調(diào)用 C++中的基礎(chǔ)屬性以及對象屬性,今天繼續(xù)來介紹另外一種:對象為列表類型的屬性調(diào)用方法。

概述

包含QObject派生類型列表的屬性也可以暴露給QML使用,但是,應(yīng)該使用QQmlListProperty類而不是QList< T >作為屬性類型。這是因?yàn)镼List不是QObject派生的類型,所以不能通過Qt元對象系統(tǒng)提供必要的QML屬性特性,例如,當(dāng)列表被修改時的信號通知,這就需要調(diào)用對象為列表類型的屬性。

QQmlListProperty是一個模板類,可以通過QList值方便地構(gòu)建。

正文

我們繼續(xù)在之前的工程中進(jìn)行修改,新建一個 School 類,示例如下:

//school.h #include <QQmlListProperty> #include <QObject> #include <QDebug> #include "student.h"class School : public QObject {Q_OBJECTQ_PROPERTY(QQmlListProperty<Student> students READ students)public:explicit School(QObject * parent = 0);QQmlListProperty<Student> students();void appendStudent(Student * stu);int studentCount() const;Student *student(int) const;void clearStudent();private:static void appendStudent(QQmlListProperty<Student> *list, Student * s);static int studentCount(QQmlListProperty<Student>*);static Student* student(QQmlListProperty<Student>*, int);static void clearStudent(QQmlListProperty<Student>*);private:QList<Student *> m_students; };//school.cpp School::School(QObject *parent) : QObject(parent) {}QQmlListProperty<Student> School::students() {return QQmlListProperty<Student>(this,this,&School::appendStudent,&School::studentCount,&School::student,&School::clearStudent); }void School::appendStudent(Student *stu) {m_students.append(stu); }int School::studentCount() const {return m_students.count(); }Student *School::student(int index) const {return m_students.at(index); }void School::clearStudent() {return m_students.clear(); }void School::appendStudent(QQmlListProperty<Student> *list, Student *s) {reinterpret_cast< School* >(list->data)->appendStudent(s); }int School::studentCount(QQmlListProperty<Student> *list) {return reinterpret_cast< School* >(list->data)->studentCount(); }Student *School::student(QQmlListProperty<Student> *list, int i) {return reinterpret_cast< School* >(list->data)->student(i); }void School::clearStudent(QQmlListProperty<Student> *list) {reinterpret_cast< School* >(list->data)->clearStudent(); }

School 里面提供了一個students列表,并注冊成QQmlListProperty類型供 QML 調(diào)用。

然后 Student 類保持不變:

class Student : public QObject {Q_OBJECTQ_PROPERTY(QString name READ getName WRITE setName NOTIFY sigNameChanged)public:explicit Student(QObject *parent = nullptr);~Student(){}void setName(const QString & name){if(name != m_name){m_name = name;emit sigNameChanged(m_name);}}QString getName() const {return m_name;} signals:void sigNameChanged(QString name);private:QString m_name;};

在 Main 函數(shù)中對類進(jìn)行注冊:

qmlRegisterType<Student>("Student", 1, 0, "Student"); qmlRegisterType<School>("School", 1, 0, "School");

然后在 QML 中進(jìn)行調(diào)用:

import QtQuick 2.8 import Student 1.0 import School 1.0School{students:[Student{name:"xiaoming"},Student{name:"zhangsan"},Student{name:"lisi"}] }

這里定義了一個School類型,其中包含三個 Student,每個 Student 設(shè)置其名稱。

然后我們回到 main 函數(shù)中 將 qml 定義好的對象打印出來看看效果:

QQmlEngine engine; QQmlComponent component(&engine, QUrl("qrc:main.qml")); School *school = qobject_cast<School *>(component.create());if(school){for (int i = 0; i < school->studentCount(); ++i)qWarning() << " " << school->student(i)->getName(); }

運(yùn)行程序,輸出如下:

"xiaoming" "zhangsan" "lisi"

本文中是試驗(yàn)從 QML 中創(chuàng)建列表對象,然后在C++中打印出創(chuàng)建好的列表,當(dāng)然也可以在 C++中創(chuàng)建好列表,然后在 QML 中進(jìn)行調(diào)用。使用方法都是一樣,這里就不再贅述。

需要注意的是,在 Qt 幫助文檔中,QQmlListProperty的使用方法如下:

class MessageBoard : public QObject {Q_OBJECTQ_PROPERTY(QQmlListProperty<Message> messages READ messages) public:QQmlListProperty<Message> messages();private:static void append_message(QQmlListProperty<Message> *list, Message *msg);QList<Message *> m_messages; };QQmlListProperty<Message> MessageBoard::messages() {return QQmlListProperty<Message>(this, 0, &MessageBoard::append_message); }void MessageBoard::append_message(QQmlListProperty<Message> *list, Message *msg) {MessageBoard *msgBoard = qobject_cast<MessageBoard *>(list->object);if (msg)msgBoard->m_messages.append(msg); }
  • 這里添加列表元素的時候只用到了一個靜態(tài)函數(shù)append_message,奇怪的是我用這種方法一直會報錯,編譯不通過,無奈之下用了第二種方法,將所有需要的靜態(tài)函數(shù)全部寫進(jìn)去了。其實(shí)該類的構(gòu)造函數(shù)有三個,如下:
QQmlListProperty::QQmlListProperty(QObject *object, QList<T *> &list) QQmlListProperty::QQmlListProperty(QObject *object, void *data, AppendFunction append, CountFunction count, AtFunction at, ClearFunction clear) QQmlListProperty::QQmlListProperty(QObject *object, void *data, CountFunction count, AtFunction at)

我用第一個構(gòu)造函數(shù)的方式一直報錯,然而使用所有參數(shù)的形式就正常,目前還不知道是什么原因,先這樣吧。

代碼在這里

與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的Qt C++属性类型提供给 QML调用(三)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产精品热久久 | 亚洲老妇色熟女老太 | 中文字幕在线看片 | 激情五月视频 | 中文字幕免费高清网站 | 国产激情一区二区三区 | 可以在线观看的黄色 | 99久久婷婷国产精品综合 | 欧美精品1| 91精品国产一区二区三竹菊影视 | 国产精品亚洲视频 | 黄色精品在线观看 | 99国产精品99久久久久久 | jizzjizz中国精品麻豆 | 97精品熟女少妇一区二区三区 | 久草色视频 | 在线观看你懂得 | 动漫美女无遮挡免费 | 99伊人| 亚洲欧美色视频 | 欧美一区高清 | 日本女v片 | 这里都是精品 | 久久久久亚洲AV成人无在 | 黄色一级录像片 | 老熟妇高潮一区二区三区 | 日韩在线综合 | 国产精品伦 | 亚洲一二三区视频 | 国产精品国产三级国产aⅴ中文 | 亚洲色欲色欲www在线观看 | a在线观看免费 | 亚洲精品福利 | 久久99在线| 午夜久久网 | 自拍偷拍视频在线观看 | 中文字幕日韩亚洲 | 色先锋资源网 | 欧美我不卡 | 成人在线精品 | 欧美视频在线免费 | 中文字幕视频一区二区 | 99久久婷婷国产综合精品青牛牛 | 欧美在线免费播放 | 91黄色短视频 | 男女视频免费看 | 玩弄白嫩少妇xxxxx性 | 成人午夜激情网 | 永久免费AV无码网站韩国毛片 | 91精品久久久久久久久中文字幕 | 天天干导航 | 污污小视频 | 99热精品在线观看 | 五月婷婷综合网 | 久久机热这里只有精品 | 欧美日韩不卡在线 | 欧美香蕉在线 | 在线观看www | 福利久久久| 国产区视频在线 | 天天看天天摸天天操 | 黄色一级视频网站 | 国产aⅴ | 被灌满精子的波多野结衣 | 亚洲视频在线免费观看 | 少妇黄色一级片 | av天天堂 | 男人透女人免费视频 | 国产精品资源网 | 色婷婷av一区二区三区软件 | 欧美国产日韩精品 | 成人试看120秒体验区 | 国产αv | 国产乱在线 | 男女午夜免费视频 | 亚洲精品少妇一区二区 | 国产免费一区二区三区视频 | 婷婷激情久久 | 爱情岛论坛亚洲品质自拍 | 亚洲国产二区 | 午夜精品久久久久久久久久久久 | 国产成人精品无码免费看81 | 在线视频免费播放 | 日韩黄色网页 | 黄网页在线观看 | 国产精品自拍一区 | 91精品国产综合久久精品 | 捆绑无遮挡打光屁股调教女仆 | 日本视频一区二区 | 黄色理伦 | 无码人妻一区二区三区一 | 91视频免费观看网站 | 亚洲精品视频在线观看免费视频 | 天天干天天噜 | 国产欧美日韩综合精品 | 青青草娱乐视频 | 91天天干 | 自拍偷拍亚洲区 | 视频免费1区二区三区 |