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

目前的程序运行结果

Qt-QML-C++交互实现文件IO系统的更多相关文章

  1. Qt-QML-C++交互实现文件IO系统-后继-具体文件IO的实现

    在上一篇文章中,我大致将这个QML中的文件IO类搭出了大致的框架,那么,今天抽时间写了一点文件的读写,这里我使用的文件流来读写文件. 文件结构如图 在QML中调用这个类了,就见简单的读取了一个JSON ...

  2. Qt-QML-C++交互实现文件IO系统-后继-读取XML文件和创建XML文件

    在前面两篇中,大致完成了一个文件IO的读和写操作.前面两篇文章链接 http://blog.csdn.net/z609932088/article/details/71488250 http://bl ...

  3. linux系统编程--文件IO

    系统调用 什么是系统调用: 由操作系统实现并提供给外部应用程序的编程接口.(Application Programming Interface,API).是应用程序同系统之间数据交互的桥梁. C标准函 ...

  4. 【分享】我们用了不到200行代码实现的文件日志系统,极佳的IO性能和高并发支持,附压力测试数据

    很多项目都配置了日志记录的功能,但是,却只有很少的项目组会经常去看日志.原因就是日志文件生成规则设置不合理,将严重的错误日志跟普通的错误日志混在一起,分析起来很麻烦. 其实,我们想要的一个日志系统核心 ...

  5. Linux学习记录--文件IO操作相关系统编程

    文件IO操作相关系统编程 这里主要说两套IO操作接口,各自是: POSIX标准 read|write接口.函数定义在#include<unistd.h> ISO C标准 fread|fwr ...

  6. 【Linux_Unix系统编程】chapter5 深入探究文件IO

    Chapter5 深入探究文件I/O 本章节将介绍另一个与文件操作相关的系统调用:多用途的fcntl(),并展示其应用之一读取和设置打开文件的状态标志. 5.1 原子操作和竞争条件 所有系统调用都是以 ...

  7. 【Linux_Unix系统编程】Chapter4 文件IO

    Chapter4 文件IO 4.1 概述 文件描述符 == Windows的句柄 标准文件描述符: 0 标准输入 STDIN_FILENO stdin 1 标准输出 STDOUT_FILENO std ...

  8. Atitit.软件开发概念说明--io系统区--特殊文件名称保存最佳实践文件名称编码...filenameEncode

    Atitit.软件开发概念说明--io系统区--特殊文件名称保存最佳实践文件名称编码...filenameEncode 不个网页title保存成个个文件的时候儿有无效字符的问题... 通常两个处理方式 ...

  9. Unix系统编程()深入探究文件IO概述

    open调用将引入原子atomicity操作的概念. 将某一系统调用所要完成的各个动作作为不可中断的操作,一次性加以执行. 原子操作是许多系统调用得以正确执行的必要条件. 还介绍一个系统调用fcntl ...

随机推荐

  1. Java实现 lower_bound() 和 upper_bound()

    Java实现 lower_bound() 和 upper_bound() lower_bound() 函数 lower_bound() 在 [begin, end) 进行二分查找,返回 大于或等于 t ...

  2. 使用C#的AssemblyResolve事件和TypeResolve事件动态解析加载失败的程序集

    我们知道反射是 依赖注入 模式的基础,依赖注入要求只在项目中引用定义接口的程序集,而不引用接口实现类的程序集,因为接口实现类的程序集应该是通过反射来动态加载的,这样才能保证接口与其实现类之间的松耦合. ...

  3. Centos7单网卡带VLAN多IP配置

    1.需要使用到vconfig软件,首先yum安装vconfig: 使用指令yum install vconfig:(若是本机找不到vconfig安装包,可以通过其他centos7安装yum-utils ...

  4. Git单人本地仓库操作

    本地仓库是个.git隐藏文件 以下为演示Git单人本地仓库操作 1.安装git sudo apt-get install git 密码:skylark 2.查看git安装结果 git 3.创建项目 在 ...

  5. PHP中级程序员常见面试题

    1).写一个函数,从一个标准url里取出文件的扩展名,需要取出php或.php <?php $a="http://www.test.com.cn:88/abc/de/fg.php?id ...

  6. AJAX 动态加载后台数据 绑定select

    <select id="select"> <!--下拉框数据动态加载--> </select> js:(使用jquery) $(document ...

  7. C++函数调用之——值传递、指针传递、引用传递

    1.简介 1.值传递:形参时实参的拷贝,改变函数形参并不影响函数外部的实参,这是最常用的一种传递方式,也是最简单的一种传递方式.只需要传递参数,返回值是return考虑的:使用值传递这种方式,调用函数 ...

  8. python学习——复习

    一.基础知识: 1.文件操作有哪些模式?请简述各模式的作用. 'r' 读模式,相应的方法有 read(),readline(),readlines() 'w' 写模式,相应的方法有 write(),w ...

  9. consonant_摩擦音

    consonant_摩擦音_[t∫].[dʒ].[tr].[dr].[ts].[dz] 破擦音:即有爆破音又有摩擦音. [t∫]:噘嘴,舌尖抵住上牙龈,舌头下切,用一瞬间的气流发出声音,不震动. ch ...

  10. Leecode刷题之旅-C语言/python-349两个数组的交集

    /* * @lc app=leetcode.cn id=349 lang=c * * [349] 两个数组的交集 * * https://leetcode-cn.com/problems/inters ...