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 {
    width: 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
    }

}

posted @ 2022-09-03 22:56  夏秋初  阅读(2167)  评论(0编辑  收藏  举报