Qt-QML-C++交互实现文件IO系统

QMl是没有自己的文件IO控制的,这里如果我们需要对文件进行读写操作,那么就需要去C++或者JS完成交互,交互方式有多种,由于我还没有掌握,这里就不介绍具体的交互方式了。这里就简单说明一下我的实现过程。

整个项目布局

文件主要包括正序main文件,C++的IO类文件,包括头文件和Cpp文件以及一个测试用的qml界面文件

 

这里需要特别注意的是,QML想与C++交互,那么在建立C++类的时候,就必须要包含<QObject>类,这里Qt为我们实现了后多东西,暂时还没有能力来一探究竟,只是知道现在需要继承QObject

 

这里,为了先吧框架搭起来,我就先简单的写两个函数,一个读文件,一个写文件。

到这里,这个文件的IO系统就基本完成了,下面分享一下代码

 

 

main.cpp

 

 

#include <QApplication>
#include <QQmlApplicationEngine>
#include "dlfileiosystem.h"
#include <QQmlContext>
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QQmlApplicationEngine engine;

    QQmlContext *context = engine.rootContext();

    DLFileIOSystem *fileio = new DLFileIOSystem();

    context->setContextProperty("FileIOSystem",fileio);


    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    return app.exec();
}


在这里需要注意的是,我用到了QQmlContext,这里也可以不用,直接使用引擎的设置代理就可以了,但是为了后面更多的添加,这里使用的QQmlContext,所以需要在都文件中包含

 

 

#include <QQmlContext>


剩下的就是把我自己写的类作为一个属性暴露给QML

 

 

自己写的dlfileiosystem.h

 

#ifndef DLFILEIOSYSTEM_H
#define DLFILEIOSYSTEM_H

#include <QObject>
#include <QJsonObject>
class DLFileIOSystem : public QObject
{
    Q_OBJECT
public:
    explicit DLFileIOSystem(QObject *parent = 0);
    Q_INVOKABLE QJsonObject DLReadFile();
    Q_INVOKABLE bool DLWriteFile();

};

#endif // DLFILEIOSYSTEM_H

 

 

 

 

 

这里需要注意的就是如果想让我们在C++中写的函数可以在QML中调用,需要在声明函数的是加上 Q_INVOKABLE关键字,目前我只是申明了一个读文件,和写文件的两个方法。

cpp中内容

 

#include "dlfileiosystem.h"

DLFileIOSystem::DLFileIOSystem(QObject *parent) : QObject(parent)
{

}

QJsonObject DLFileIOSystem::DLReadFile()
{
    //这里将实现文件的打开并从文件中读取内容
    QJsonObject date;
    return date;
}

bool DLFileIOSystem::DLWriteFile()
{
    //这里将实现文件的写入和关闭文件
    return true;
}

 

 

 

 

 

这里只有框架,内容还没有写,因为我还不知道是应该把文件写到XML中,还是普通文件中了。所以还没有写,详细可以看后面更新的文章

 

QML文件

 

import QtQuick 2.5
import QtQuick.Controls 1.4

ApplicationWindow {
    visible: true
    width: 1366
    height: 768
    title: qsTr("FIle IO System")
    Rectangle
    {
        id:btn_open
        width: 100
        height: 30
        anchors
        {
            right:parent.right
            bottom:parent.bottom
            margins:20
        }
        border.color: "#FF0000"
        border.width: 2
        MouseArea
        {
            anchors.fill: parent
            onClicked:
            {
                var date = FileIOSystem.DLReadFile()
            }
        }
        Text {
            anchors.centerIn: parent
            text: qsTr("打开文件")
        }
    }
    Rectangle
    {
        id:btn_close
        width: 100
        height: 30
        anchors.right: btn_open.left
        anchors.rightMargin: 20
        anchors.bottom: parent.bottom
        anchors.bottomMargin: 20
        border.color: "#00FF00"
        border.width: 2
        MouseArea
        {
            anchors.fill: parent
            onClicked:
            {
                FileIOSystem.DLWriteFile()
            }
        }
        Text
        {
            anchors.centerIn: parent
            text: qsTr("关闭文件")
        }
    }

    TextField
    {
        width: 1000
        height: 600
        anchors
        {
            top:parent.top
            left:parent.left
            margins:20
        }
    }

}


在这个QML文件中,这里有没有做太多内容,只是简单的做了两个按钮,一个打开文件按钮,一个关闭文件按钮,还有一个TextField用来显示和编辑文件。

 

目前的程序运行结果

 

 

 

 

 一、ASCII 输出   为了使用下面的方法, 你必须包含头文件(译者注:在标准C++中,已经使用取 代,所有的C++标准头文件都是无后缀的。)。这是 的一个扩展集, 提供有缓 冲的文件输入输出操作. 事实上, 已经被包含了, 所以你不必包含所有这两个 文件, 如果你想显式包含他们,那随便你。我们从文件操作类的设计开始, 我会讲解如何进行ASCII I/O 操作。如果你猜是"fstream," 恭喜你答对了! 但这篇文章介绍的方法,我们分别使用"ifstream"?和 "ofstream" 来作输入输出。   如果你用过标准控制台流"cin"?和 "cout," 那现在的事情对你来说很简单。 我们现在开始讲输出部 分,首先声明一个类对象。 ofstream fout;   这就可以了,不过你要打开一个文件的话, 必须像这样调用ofstream::open()。 fout.open("output.txt");   你也可以把文件名作为构造参数来打开一个文件. ofstream fout("output.txt");   这是我们使用的方法, 因为这样创建和打开一个文件看起来更简单. 顺便说一句, 如果你要打开的文 件不存在,它会为你创建一个, 所以不用担心文件创建的问题. 现在就输出到文件,看起来和"cout"的操 作很像。 对不了解控制台输出"cout"的人, 这里有个例子。 int num = 150; char name[] = "John Doe"; fout << "Here is a number: " << num << " "; fout << "Now here is a string: " << name << " ";   现在保存文件,你必须关闭文件,或者回写文件缓冲. 文件关闭之后就不能再操作了, 所以只有在你 不再操作这个文件的时候才调用它,它会自动保存文件。 回写缓冲区会在保持文件打开的情况下保存文 件, 所以只要有必要就使用它。回写看起来像另一次输出, 然后调用方法关闭。像这样: fout << flush; fout.close();    现在你用文本编辑器打开文件,内容看起来是这样:   Here is a number: 150 Now here is a string: John Doe   很简单吧! 现在继续文件输入, 需要一点技巧, 所以先确认你已经明白了流操作,对 "<>" 比较熟悉了, 因为你接下来还要用到他们。继续…   二、ASCII 输入   输入和"cin" 流很像. 和刚刚讨论的输出流很像, 但你要考虑几件事情。在我们开始复杂的内容之前 , 先看一个文本:   12 GameDev 15.45 L This is really awesome!   为了打开这个文件,你必须创建一个in-stream对象,?像这样。 ifstream fin("input.txt");   现在读入前四行. 你还记得怎么用"<<" 操作符往流里插入变量和符号吧?好,?在 "<>" (提取) 操作符. 使用方法是一样的. 看这个代码片段.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DreamLife.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值