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

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

整个项目布局

image.png

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



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

image.png

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

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




main.cpp




#include

#include

#include "dlfileiosystem.h"

#include

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


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




自己写的dlfileiosystem.h



#ifndef DLFILEIOSYSTEM_H

#define DLFILEIOSYSTEM_H


#include

#include

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用来显示和编辑文件。



目前的程序运行结果

image.png

目录
相关文章
|
1月前
|
网络协议 安全 Linux
Linux C/C++之IO多路复用(select)
这篇文章主要介绍了TCP的三次握手和四次挥手过程,TCP与UDP的区别,以及如何使用select函数实现IO多路复用,包括服务器监听多个客户端连接和简单聊天室场景的应用示例。
90 0
|
1月前
|
存储 Linux C语言
Linux C/C++之IO多路复用(aio)
这篇文章介绍了Linux中IO多路复用技术epoll和异步IO技术aio的区别、执行过程、编程模型以及具体的编程实现方式。
84 1
Linux C/C++之IO多路复用(aio)
|
7天前
|
Java 测试技术 Maven
Maven clean 提示文件 java.io.IOException
在使用Maven进行项目打包时,遇到了`Failed to delete`错误,尝试手动删除目标文件也失败,提示`java.io.IOException`。经过分析,发现问题是由于`sys-info.log`文件被其他进程占用。解决方法是关闭IDEA和相关Java进程,清理隐藏的Java进程后重新尝试Maven clean操作。最终问题得以解决。总结:遇到此类问题时,可以通过任务管理器清理相关进程或重启电脑来解决。
|
1月前
|
存储 Windows
(13) Qt事件系统(two)
文章详细介绍了Qt事件系统,包括事件分发、自定义事件、事件传播机制、事件过滤以及事件与信号的区别。
80 3
(13) Qt事件系统(two)
|
1月前
|
编解码 程序员
(12)Qt事件系统(one)
本文详细介绍了Qt事件系统,包括各种系统事件、鼠标事件、键盘事件、定时器等的处理方法和示例代码。
72 0
(12)Qt事件系统(one)
|
1月前
|
Linux C++
Linux C/C++之IO多路复用(poll,epoll)
这篇文章详细介绍了Linux下C/C++编程中IO多路复用的两种机制:poll和epoll,包括它们的比较、编程模型、函数原型以及如何使用这些机制实现服务器端和客户端之间的多个连接。
24 0
Linux C/C++之IO多路复用(poll,epoll)
|
1月前
|
Linux C++
Linux c/c++文件的基本操作
在Linux环境下使用C/C++进行文件的基本操作,包括文件的创建、写入、读取、关闭以及文件描述符的定位。
20 0
Linux c/c++文件的基本操作
|
1月前
|
搜索推荐 索引
【文件IO】实现:查找文件并删除、文件复制、递归遍历目录查找文件
【文件IO】实现:查找文件并删除、文件复制、递归遍历目录查找文件
35 2
|
1月前
|
编解码 Java 程序员
【文件IO】文件内容操作
【文件IO】文件内容操作
49 2
|
1月前
|
存储 Java API
【文件IO】文件系统操作
【文件IO】文件系统操作
43 1
下一篇
无影云桌面