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 ... }
我有一个类将TaskInfo对象发送到QML: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
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声明了信号argQObject
,而不是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中可用(不支持信号和插槽)。