Qt 接收C++;插槽中的对象 我想通过信号槽发送一个C++对象到QML: class TaskInfo : public QObject { Q_OBJECT Q_PROPERTY(QString name READ taskName) ... // constructors public: TaskInfo(); TaskInfo(QIODevice *in); TaskInfo(TaskInfo &&taskInfo); TaskInfo(const TaskInfo &taskInfo); // it's just copy all variable ... }

Qt 接收C++;插槽中的对象 我想通过信号槽发送一个C++对象到QML: class TaskInfo : public QObject { Q_OBJECT Q_PROPERTY(QString name READ taskName) ... // constructors public: TaskInfo(); TaskInfo(QIODevice *in); TaskInfo(TaskInfo &&taskInfo); TaskInfo(const TaskInfo &taskInfo); // it's just copy all variable ... },qt,qml,qt5,qtquick2,Qt,Qml,Qt5,Qtquick2,我有一个类将TaskInfo对象发送到QML: class DLDataConverter : public QObject { Q_OBJECT signals: void taskAdded_testQML(const TaskInfo taskInfo); void taskAdded_useQString(const QString taskInfo); ... } 我还发出一个信号,并在QML中接收它: void DLDataConverter::a

我有一个类将TaskInfo对象发送到QML:

class DLDataConverter : public QObject
{
    Q_OBJECT

signals:
    void taskAdded_testQML(const TaskInfo taskInfo);
    void taskAdded_useQString(const QString taskInfo);
    ...
}
我还发出一个信号,并在QML中接收它:

void DLDataConverter::addItem(const TaskInfo &taskInfo)
{
    emit taskAdded_testQML(taskInfo);
    emit taskAdded_useQString(taskInfo.getInfoToString());
}
QML代码:

Connections {
    target: DLDataConverter

    onTaskAdded_testQML: {
        console.log(taskInfo);
    }

    onTaskAdded_useQString: {
        console.log(taskInfo);
    }
}
onTaskAdded_useQString信号工作正常,但onTaskAdded_testQML打印“未定义”

我已注册了以下类型:

qmlRegisterType(“taskInfo”,1,0,“taskInfo”)
qmlRegisterSingletonType(“Singleton.DLDataConverter”,1,0,“DLDataConverter”,dataObj)

我可以创建
TaskInfo
对象,它运行良好:

TaskInfo{
    id: t
}


Connections {
    target: DLDataConverter

    onTaskAdded_testQML: {
        console.log(t.name);  // print default value, is "Noname"
        console.log(taskInfo);  // print 'undefined'
    }
}

QML通过将每个参数转换为
QVariant
,然后(如果可能)转换为本机JavaScript值来使用来自Qt的数据。如果它们无法转换为JS,您仍然可以复制它们并与JS一起传递,但您将无法使用它们。在不扩展
QVariant
的情况下,只有
QObject*
可以保存在
QVariant
中,并由JS执行线程,其属性、插槽和信号对JS可见。任何指向对象的指针,其类派生自
QObject
,都会通过
QVariant
隐式转换为
QObject*
。因此,您可以自由地将指向类的指针的信号定义为:

class DLDataConverter : public QObject
{
    Q_OBJECT

signals:
    void taskAdded_testQML(TaskInfo *taskInfo);
    void taskAdded_useQString(const QString taskInfo);
    ...
}
指针引入了对象生存期的问题,因此您肯定应该了解更多有关如何使用指针的信息。 如果在Qml中创建对象,如下所示:

TaskInfo{
    id: t
}

创建一个对象,该对象具有一个父对象,其生存期决定对象本身的生存期。指针绑定到本地QML上下文中的名称
t

给定第一个代码段,它是否从
QObject
派生出
TaskInfo
?@cmannett85。我想知道
addItem
中使用的
taskInfo
引用是否在代码中正确处理。按照大多数老年退休金计划通常的坏习惯,我们只看到一小部分代码:-|@BaCaRoZzo Woops,应该已经正确读取了第一个代码块。。。我的直觉是,这是因为OP声明了信号arg
QObject
,而不是
QObject*
,我很惊讶,甚至由于缺少复制构造函数而编译。@cmannett85好视力人!很可能这就是问题所在。:)@BaCaRoZzo我可以在QML中创建
TaskInfo
对象,它工作得很好,只是不能通过信号槽发送
TaskInfo
对象。+对于指向C++/QML数据所有者的链接,谢谢!有没有办法在信号中发送非指针参数,以便它在QML端工作?@knocker\u d any应该在QML中工作。任何其他的都可以通过QML传递,但要在QML中使用,它需要是一个声明为Q_GADGET的结构(在Qt>=5.5中)。@Arpegius:是的,谢谢。我正在把代码从Qt C++移植到QML。若我在信号参数中使用非指针,它是自定义类并注册到元类型,那个么在插槽中我会看到QVariant。我能不能把它“强制”到QML中的MyClass实例上?@knocker\d这取决于MyClass是什么,如果它继承了QObject,你就大错特错了,应该停止,指针是唯一的方法。如果没有,您可以将Q_GADGET makro添加到MyClass,然后使用Q_属性和Q_INVOKABLE在QML中可用(不支持信号和插槽)。