首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何让一个自定义的C++类成为一个QML类型?

如何让一个自定义的C++类成为一个QML类型?
EN

Stack Overflow用户
提问于 2019-03-05 04:02:51
回答 1查看 972关注 0票数 0

我正在尝试将一个简单的结构从C++推送到QML,但我似乎无法注册它:

messages.h

代码语言:javascript
复制
#pragma once

#include <QString>
#include <QMetaType>

struct Ticket {
  Q_GADGET
  Q_PROPERTY(QString name MEMBER name)
  Q_PROPERTY(QString description MEMBER description)

  public:
  QString name;
  QString description;
};
Q_DECLARE_METATYPE(Ticket);

我正在将其提供给QML:

main.cpp

代码语言:javascript
复制
#include <QtWidgets>

#include "MyWindow.h"
#include "messages.h"

int main(int argc, char *argv[])
{
  QApplication app(argc, argv);
  qmlRegisterType<Ticket>("myself", 1, 0, "Ticket");
  MyWindow the_window;
  the_window.show();

  return app.exec();
}

编辑:包含QML以供参考

代码语言:javascript
复制
import QtQuick.Layouts 1.11
import QtQuick 2.11

RowLayout {
  id: layout
  property var tickets

  onTicketsChanged: {
    console.log("dum dum dum");
  }
}

编译时,我得到以下错误:

代码语言:javascript
复制
/Users/myself/lib/Qt/5.11.2/clang_64/lib/QtQml.framework/Headers/qqmlprivate.h:101:24: error: only virtual member
      functions can be marked 'override'
        ~QQmlElement() override {
                       ^
/Users/myself/lib/Qt/5.11.2/clang_64/lib/QtQml.framework/Headers/qqmlprivate.h:107:50: note: in instantiation of
      template class 'QQmlPrivate::QQmlElement<Ticket>' requested here
    void createInto(void *memory) { new (memory) QQmlElement<T>; }
                                                 ^
/Users/myself/lib/Qt/5.11.2/clang_64/lib/QtQml.framework/Headers/qqml.h:292:33: note: in instantiation of function
      template specialization 'QQmlPrivate::createInto<Ticket>' requested here
        sizeof(T), QQmlPrivate::createInto<T>,
                                ^
/Users/myself/dev/my_project/src/MyWindow.cpp:69:3: note: in instantiation of function template specialization
      'qmlRegisterType<Ticket>' requested here
  qmlRegisterType<Ticket>("myself", 1, 0, "Ticket");
  ^
1 error generated.

有没有办法,使我的QML中的票证结构可用,这样我就可以将值从C++推送到QML?或者,有没有办法在qmlRegisterType上下文中找出virtual member override错误的含义?

EN

回答 1

Stack Overflow用户

发布于 2019-03-05 04:14:16

你不能和Q_GADGETS一起。您可以让它们为人所知(Q_DECLARE_METATYPE),但是您不能将它们注册为QML类型。一旦知道了它们,您就可以使用它们,但不能在QML端创建它们。

解决这个问题的一种方法是,例如,让一个helper类(单例或上下文属性)和一个(静态)成员函数返回gadget的一个实例。

如果你想同时创建它们,你必须使用Q_OBJECT宏并继承QObject (注意Q_DECLARE_METATYPE需要一个指针)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54990704

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档