• Qt6.2.4 qml 实现文件选择与内容读取


    参考

    环境

    环境 版本
    windows 10
    QT 6.2.4
    Qt Creator 8.0.1 (Community)
    qmake

    注意事项

    • FileDialog 读取的文件路径是 url 格式,需要转换一下才能够使用 QFile file(filePath); 接收

    项目结构

    image

    运行截图

    image

    完整代码

    通过这种方式可以直接创建两个文件,.h与.cpp

    image

    1. Headers 文件夹下创建 FileObject.h 文件
    #ifndef FILE_OBJECT_H
    #define FILE_OBJECT_H
    
    #include <QObject>
    
    class FileObject : public QObject
    {
        Q_OBJECT
        Q_PROPERTY(QString source READ source WRITE setSource NOTIFY sourceChanged)
    public:
        explicit FileObject(QObject *parent = 0);
    
        Q_INVOKABLE QString read();
        Q_INVOKABLE bool write(const QString& data);
    A
        void setSource(const QString& source) { m_source = source; };
        QString source() { return m_source; }
    
    signals:
        void sourceChanged(const QString& source);
    
    private:
        QString m_source;
    };
    
    #endif // FILE_OBJECT_H
    
    
    1. Sources 文件夹下创建 fileobject.cpp 文件
    #include "FileObject.h"
    
    #include <QUrl>
    #include <QFile>
    #include <QTextStream>
    
    FileObject::FileObject(QObject *parent) :
        QObject(parent)
    {
    
    }
    
    QString FileObject::read()
    {
        // 做一下转换,将file:///C:/xxx 转换为 C:/xxx
        QUrl url(m_source);
        QString content;
        QFile file(url.toLocalFile());
        if ( file.open(QIODevice::ReadOnly) ) {
            content = file.readAll();
            file.close();
        }
    
        return content;
    }
    
    bool FileObject::write(const QString& data)
    {
        QFile file(m_source);
        if ( file.open(QFile::WriteOnly | QFile::Truncate) ) {
            QTextStream out(&file);
            out<<data;
            file.close();
            return true;
        }
        else {
            return false;
        }
    }
    
    
    
    1. 将对象注册到 Sources/main.cpp
    #include <FileObject.h>
    #include <QGuiApplication>
    #include <QQmlApplicationEngine>
    
    
    int main(int argc, char *argv[])
    {
    #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
        QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    #endif
        QGuiApplication app(argc, argv);
    
        QQmlApplicationEngine engine;
        const QUrl url(QStringLiteral("qrc:/main.qml"));
    	// 注册对象,这样qml引入后就可以调用了
        qmlRegisterType<FileObject>("FileObject", 1, 0, "FileObject");
    
        QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
                         &app, [url](QObject *obj, const QUrl &objUrl) {
            if (!obj && url == objUrl)
                QCoreApplication::exit(-1);
        }, Qt::QueuedConnection);
        engine.load(url);
    
        return app.exec();
    }
    
    
    1. Resources 下 main.qml 代码
    import QtQuick 2.15
    import QtQuick.Window 2.15
    import QtQuick.Controls 2.15
    import Qt.labs.platform 1.1
    import Qt3D.Render 2.2
    // 先引入才能使用
    import FileObject 1.0
    
    Window {
         640
        height: 480
        visible: true
        title: qsTr("Hello World")
        FileDialog {
             id: fileDialog
             title: "选择一个文件"
             onAccepted: {
                  console.log("You chose: " + fileDialog.file);
                 label.text = "文件路径:"+fileDialog.file
                 fileObject.source = fileDialog.file
                 fileContent.text = "文件内容:"+fileObject.read()
             }
         }
        Button{
            id: action
            text: "选择文件"
            anchors.centerIn: parent
            onClicked: {
                fileDialog.open()
            }
        }
        Label{
            id: label
            anchors.top: action.bottom
            anchors.horizontalCenter: parent.horizontalCenter
        }
        FileObject{
            id: fileObject
        }
        Label{
            id: fileContent
            anchors.top: readFileContent.bottom
            anchors.horizontalCenter: parent.horizontalCenter
        }
    
    }
    
    
  • 相关阅读:
    C#面向对象五(继承、抽象类和抽象方法、多态、虚方法、is、as、new覆盖关键字)
    C#面向对象四(文件与目录操作、序列化与反序列化、XML)
    C#面向对象三(常用控件)
    C#面向对象二(集合泛型及排序)
    C#面向对象一(方法、封装、类、两种数据类型)
    如何最快找到重点 —— 小小码虫瞎想の效率与绩效篇(一)
    Android Telephony —— 手机信号实时变化源码分析过程记录
    Android 某些配置记录
    Macbook Pro 使用小记
    fhq treap 范浩强平衡树
  • 原文地址:https://www.cnblogs.com/xiaqiuchu/p/16653894.html
Copyright © 2020-2023  润新知