Qt开发环境下QML调用已定义的C++类(以导出文件功能为例)

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

由于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")
        }
    }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值