C++ Q_INVOKABLE不向QML公开方法

C++ Q_INVOKABLE不向QML公开方法,c++,qt,qml,qt5,C++,Qt,Qml,Qt5,我想从QML调用C++方法,将参数传递给它。据我所知,我应该用宏Q\u对象标记类,用Q\u可调用标记所需的公共函数 虽然我做到了,但我仍然遇到运行时错误 qrc:/main.qml:42: TypeError: Property 'addFile' of object QObject(0xf20e90) is not a function 这是我的.hpp和.cpp类文件: lib_controller.hpp main.cpp 我想要的是调用函数addFile()来构造文件管理器成员,然后它

我想从QML调用C++方法,将参数传递给它。据我所知,我应该用宏
Q\u对象
标记类,用
Q\u可调用
标记所需的公共函数

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

qrc:/main.qml:42: TypeError: Property 'addFile' of object QObject(0xf20e90) is not a function
这是我的
.hpp
.cpp
类文件:

lib_controller.hpp

main.cpp

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


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

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

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

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

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

根据,<代码>文件> <代码>属性>文件IDEAL < /COD>返回一个等价于C++类型而不是qStand的类型。因此,您可以:

    <> >编辑你的C++方法,取两个代码> qURL < /代码> S.< /P>
  • 或者在QML过程中
    .fileUrl.toString()

根据文件> <代码>属性> FieldLoga< /Cult>返回一个等价于C++类型而不是qSnk的类型。因此,您可以:

    <> >编辑你的C++方法,取两个代码> qURL < /代码> S.< /P>
  • 或者在QML过程中
    .fileUrl.toString()


对不起,我没有提到这一点,因为我认为这是多余的,但我有这个元素。另外,对不起,我没有提到这一点,因为我认为这是多余的,但我有这个元素。我还编辑了问题哦,天哪,谢谢你发现了这个错误!但它并没有解决添加文件的问题,问题仍然存在。。。为了让我的意图更清楚,我稍微编辑了问题的结尾。哦,天哪,谢谢你发现了这个错误!但它并没有解决添加文件的问题,问题仍然存在。。。我稍微修改了问题的结尾,以使我的意图更清楚。谢谢您的回答!我将QML代码更改为,但错误仍然存在。也许它返回的是JS字符串,而不是QString?或者其他地方有问题?@nonForgivingJesus请最小化代码并将问题隔离在一个单独的环境中。@nonForgivingJesus我测试了你的代码,它工作得很好。好吧,我的项目现在不知怎么坏了,我会接受答案,然后想办法让它再次工作……谢谢你的回答!我将QML代码更改为,但错误仍然存在。也许它返回的是JS字符串,而不是QString?或者其他地方有问题?@nonForgivingJesus请最小化代码并将问题隔离在一个单独的环境中。@nonForgivingJesus我测试了你的代码,它工作得很好。好吧,我的项目现在不知怎么坏了,我会接受答案,然后再考虑如何使它再次工作。。。
#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);
        ...
};
#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());
}

...
#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();
}
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 }