[原创]如何在Qml和C++类之间进行交互(枚举,成员变量,成员函数)

[原创]如何在Qml和C++类之间进⾏交互(枚举,成员变量,成
员函数)
在QtQuick项⽬中,我们可能会⽤到Qt的各种库(QSettings, QtXml等),这个时候就要我们去解决Qt库和Qml交互的问题,即C++和Qml的交互,特别当我们需要从Qml访问C++类的成员。要想在Qml中访问C++类,要分别在⼏个⽂件中做⼀些前提⼯作,下⾯⽤我在goodoffood项⽬中的代码作为⽰例:
⼀、导出C++类的成员变量和函数
Settings.h
// Settings继承Qt的QSettings类
// ⽤来存储程序运⾏时所需的数据信息(是否第⼀次启动isFristBoot,当前的语⾔currentLanguage等)
class Settings: public QSettings {
Q_OBJECT
  // 导出成员变量,供外部访问
// expose method to qml context
Q_PROPERTY (LanguageType currentLanguage READ getLanguage WRITE setLanguage NOTIFY languageChanged) // 导出currentLanguage及对应的get,set接⼝    Q_PROPERTY (bool firstBoot READ getFirstBoot WRITE setFirstBoot) // 导出firstBoot及对应的get,set接⼝
Q_PROPERTY (bool accept READ getAccept WRITE setAccept) // 导出accept及对应的get,set接⼝
  Q_ENUMS(LanguageType) // 导出枚举类型
public:
enum LanguageType {
Null = 0,
LanguageZh,
LanguageTw,
LanguageEn,
LanguageDefault = LanguageEn
};
public:
Settings();
Settings(const QString &organization, const QString &application);
public:
void loadSettings();
LanguageType getLanguage() const;
void setLanguage(LanguageType language);
bool getFirstBoot() const;
void setFirstBoot(bool value);
bool getAccept() const;
void setAccept(bool value);
void setAppPath(const QString &folder);
// 导出成员函数,供外部调⽤
Q_INVOKABLE QString getXmlFilename(LanguageType language) const;
Q_INVOKABLE QString getSourceFilename(LanguageType language) const;
signals:
void languageChanged(LanguageType language);
private:
LanguageType currentLanguage; // save the language type
};
⼆、给C++类的包名(通过这个⽅法就可以在Qml中访问C++类)
main.cpp
qmlRegisterType<CSettings>("settings",1,0,"CSettings"); // 1,0为版本号的命名,第⼀个settings为路径名,第⼆个CSettings为类名
⽰例⽤法:
Language.qml:
// import QtQuick 1.0 // to target S60 5th Edition or Maemo 5
import QtQuick 1.1
kia.symbian 1.1
import settings 1.0 // 导⼊包名,有点类似Java
import ".."
import "../script/Logic.js"as Logic
Page {
Column {
id: buttonBox
spacing: 50
ToolButton {
text: "简体中⽂"
iconSource: "../images/languagezh.png"
onClicked: Logic.setCurrentLanguage(0)
platformStyle: ToolButtonStyle {acceptlanguage
buttonWidth: parent.width /2
}
}
    ...
    ...
    ...
} // end column
}
Logic.js:
function setCurrentLanguage(index)
{
switch (index) {
case0: {
Settings.currentLanguage = CSettings.LanguageZh; // 使⽤C++类的枚举值break;
}
case1: {
Settings.currentLanguage = CSettings.LanguageTw;
break;
}
case2: {
Settings.currentLanguage = CSettings.LanguageEn;
break;
}
default: break;
}
}
三、设置Qml上下⽂(通过此步骤就可以在Qml中访问C++类的对象)Settings settings("com.huistrong","goodoffood");
QmlApplicationViewer viewer;
⽰例⽤法
main.qml:
PageStackWindow {
id: appWindow
// Qml访问Settings类的成员变量currentLanguage
property int language: Settings.currentLanguage
...
...
}

本文发布于:2024-09-22 05:29:39,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/4/371327.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:成员   导出   是否   变量
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议