由于QML存在很多功能不能实现的问题,有的时候我们需要调用自己定义的C++类来完成这些功能,例如QML就不能实现文件的读写功能。
下面我们就以导出文件为例,看看QML是如何实现对C++类的调用的
//头文件:ExportToFile.h
/*能被QML直接调用的类,必须是继承自QObject类的新类*/
#include <QObject>
#include <QDir>
#include <QTextStream>
class OutputCSV : public QObject
{
Q_OBJECT
public:
explicit OutputCSV(QObject *parent = 0);
Q_INVOKABLE bool exportToFile(const QString context, const QString fileName, const QString filePath); //被调用的函数必须添加关键字 Q_INVOKABLE 进行声明
signals:
public slots:
};
#endif // OUTPUTCSV_H
//源文件:ExportToFile.h
#include "OutputCSV.h"
OutputCSV::OutputCSV(QObject *parent) : QObject(parent)
{
}
/*导出数据流到相应路径下的文件中*/
bool OutputCSV::exportToFile(const QString context, const QString fileName, const QString filePath)
{
bool res = false;
QDir folder;
QFile file;
bool pathCheck = true;
if(!folder.exists(filePath)) {
pathCheck = folder.mkpath(filePath);
}
if(pathCheck) {
QString fileUrl = filePath + "/" + fileName;
file.setFileName(fileUrl);
file.open(QIODevice::ReadWrite);
if(file.isOpen()) {
QTextStream out(&file);
if(file.size() > 0) {
if(file.resize(0)) {
out << context;
out.flush();
res = true;
}
} else {
out << context;
out.flush();
res = true;
}
}
file.close();
}
return res;
}
接下来在main函数中注册这个类
//main.cpp
......
#include "ExportToFile.h" //记得先包含该类的头文件
......
int main(int argc, char *argv[])
{
......
qmlRegisterType<ExportToFile, 1>("ExportToFile", 1, 0, "ExportToFile"); //注册语句
......
}
在QML文件中调用该类
//main.qml
import QtQuick 2.1
import QtQuick.Controls 1.1
import QtQuick.Window 2.1
import ExportToFile 1.0 //记得此处需要 import 该类的注册名
Window {
visible: true
width: 640
height: 480
title: qsTr("Hello World")
Button {
activeFocusOnTab: false
text: "確定"
/*使用前需要创建一个该类的实例*/
OutputCSV {
id: output
}
/*按下“确定”按钮,执行创建文件的操作*/
onClicked: {
output.exportToFile("test", "NewFile.txt", "./")
console.debug("begin export to file")
}
}
}

本文介绍了在Qt开发环境下,如何通过QML调用自定义的C++类来解决QML无法直接实现文件读写的问题。以导出文件功能为例,详细阐述了在main函数中注册C++类以及在QML文件中如何调用该类的方法。
2122

被折叠的 条评论
为什么被折叠?



