Q_INVOKABLE 不会向 QML 公开方法



我想从QML调用C++方法,向其传递参数。据我了解,我应该用宏Q_OBJECT标记类,用Q_INVOKABLE标记所需的公共函数。

虽然我做到了,但我仍然遇到运行时错误

qrc:/main.qml:42: TypeError: Property 'addFile' of object QObject(0xf20e90) is not a function

这是我对该类的.hpp.cpp文件:

lib_controller.hpp

#include <QObject>
#include <QString>
...
class LibController : public QObject{
Q_OBJECT
Q_PROPERTY(decltype(getProgress) progress READ getProgress NOTIFY ProgressChanged)
public:
...
Q_INVOKABLE
void addFile(QString from_name, QString to_name);
...
};

lib_controller.cpp

#include "lib_controller.hpp"
...
void LibController::addFile(QString from_name, QString to_name){
file_manager = new FileManager(from_name.toUtf8().constData(),
to_name.toUtf8().constData());
}
...

主.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlComponent>
#include "lib_controller.hpp"
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
// Registration of custom type
qmlRegisterType<LibController>("com.sort.controller", 0, 1, "LibController");
...
return app.exec();
}

主.qml

import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Controls 2.0
import QtQuick.Dialogs 1.2
import com.sort.controller 0.1
...
FileDialog {
id: fileDialog_for_load
title: "Load file"
onAccepted: {
fileDialog_for_save.open()
}
}
FileDialog {
id: fileDialog_for_save
title: "Save file"
onAccepted: {
var loadPath = fileDialog_for_load.fileUrl.toString();
loadPath = loadPath.replace(/^(file:/{2})/,"");
var savePath = fileDialog_for_save.fileUrl.toString();
savePath = savePath.replace(/^(file:/{2})/,"");
console.log("Save Path:" + savePath)
libController.addFile(loadPath, savePath)
}
}
LibController { id: libController }

我想要的是调用函数addFile()构造file_manager成员,然后它需要对新文件进行排序。

为什么会发生此错误?我做错了什么?

根据文档,FileDialogfileUrl属性返回一个url类型,该类型等效于C++类型QUrl而不是 QString。因此,您可以:

  • 编辑您的C++方法,使其需要两个QUrl

  • 或者在您的 QML 通行证中.fileUrl.toString().

在libcontroller构造函数中,删除私有成员而不是初始化它。

我认为您在main.qml中缺少一个实例化LibController { id:libController }的组件。

相关内容

  • 没有找到相关文章

最新更新