将 Qt 函数导入 QML 文件?

Posted

技术标签:

【中文标题】将 Qt 函数导入 QML 文件?【英文标题】:Import Qt function to QML file? 【发布时间】:2020-01-13 15:37:55 【问题描述】:

您如何在 Qt 5.5 的 QML 文件中调用例如 QFile::exists(path)

MyFile.qml

import QtQuick 2.5

// These are some various things I've tried, with the error message they 
// give related to the row where I call QFile::exists()

#include <QFile>      // Expected token `'
import QtQml 2.5      // Expected token `;'
import io.qt          // Expected token `;'
import io.qt.QFile    // Expected token `;'

Item 
    id: root
    property string imageSource

    Image 
        id: test
        source: fileOrFallback(root.imageSource)
    

    function fileOrFallback (source) 
        return QFile::exists(source)
            ? preprocessor.getFilePath(source)
            : theme.example + 'placeholder.png'
    


我已经看到了一些关于如何导入自定义 Qt 函数的示例,但是如何在 QML 中调用内置 Qt 函数?

【问题讨论】:

【参考方案1】:

您不能直接导入 C++ 函数,在这些情况下,方法是创建一个通过 Q_INVOKABLE 公开该方法的 QObject:

backend.h

#ifndef BACKEND_H
#define BACKEND_H

#include <QObject>

class Backend : public QObject

    Q_OBJECT
public:
    using QObject::QObject;
    Q_INVOKABLE bool exists(const QString &fileName);

;

#endif // BACKEND_H

backend.cpp

#include "backend.h"

#include <QFile>

bool Backend::exists(const QString &fileName)
    return QFile::exists(fileName);

ma​​in.cpp

#include "backend.h"

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>

int main(int argc, char *argv[])

    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

    QGuiApplication app(argc, argv);

    Backend backend;
    QQmlApplicationEngine engine;
    engine.rootContext()->setContextProperty("backend", &backend);
    const QUrl url(QStringLiteral("qrc:/main.qml"));
    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();

*.qml

// ...
function fileOrFallback (source) 
    return backend.exists(source)
        ? preprocessor.getFilePath(source)
        : theme.example + 'placeholder.png'

// ...

【讨论】:

以上是关于将 Qt 函数导入 QML 文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 QT QML 中创建自己的目录?

未找到 Qt Creator 导入文件

如何将 Switch Qml 添加到 qt 小部件?

在 qt creator 中从 ..qml 文件生成 .cpp 和 .h 文件

QT怎样将一个结构体作为函数参数从C++传递到QML

QT开发(五十四)———QML组件