问题标签 [qmetaobject]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
316 浏览

c++ - 使用 Qt 的元对象系统获取对象实例类名

我有 3 节课:

存在的实现如下:

我有以下代码:

问题是:有没有办法实现Being的构造函数,以便我可以访问指向我的Being基类的实际实例,以便上述代码的日志为:

?

编辑: 我的意图是我希望能够拥有一个Animal.txt,Being.txt并将Doc.txt在 Being 基类中处理。而且我需要知道,根据实例的类型,我是否需要 parseAnimal.txtBeing.txt获取Doc.txt更多信息。

Qt 支持这个吗?有没有一种机制我可以使用 C++/Qt 来实现这一点?如果没有,是否有任何优雅的妥协解决方案?

0 投票
2 回答
196 浏览

c++ - 枚举属性未被识别为

我一直在尝试实现一些我认为应该非常简单的东西,但是遇到了问题。简而言之,我有一个包含一些 的类,其中Q_Properties一些我想成为命名空间级别的enum值。我的问题是,如果我将enum其移动namespace到单独的文件中,QProperty系统将无法识别该属性是一个enum值。

这是一个精简的版本来说明:

一个文件包含一个带有枚举的命名空间以及我尝试与枚举一起使用的类:

我的头文件包含另一个命名空间和枚举:

我的主要:

当我运行这个程序时,它输出以下内容:

如您所见,在与类相同的文件中声明的枚举在属性系统中按预期工作,但在头文件中声明的枚举未被识别为枚举。我该如何解决这个问题?我已经删除了构建文件夹,重新运行qmake,我能想到的一切都很明显,没有任何变化。

0 投票
1 回答
44 浏览

c++ - QMetaObject::invokeMethod 不调用槽

我在workspacemanager 类中有一个名为UpdateScreenshots 的公共信号,用于截取一些小部件的屏幕截图。然后它在我定义的结构中返回这些屏幕截图。这个调用是从一个线程进行的,因为截屏显然只能在主线程上完成。但是,此 invokemethod 调用不起作用,并且未调用 updatescreenshots 插槽。我可能做错了什么?有一个更好的方法吗?

调用方法调用

槽的定义;

0 投票
0 回答
47 浏览

python - 将继承的 QObject 的元对象注册到 QJSEngine

我想继承QObject该类,并将继承类的元对象注册到一个 QJSEngine 实例,以便我可以let instance = new TrialObject();在 JavaScript 中调用。这是我的代码:

当(如上所述),我使用QObject.staticMetaObjectas 时TrialObject,JavaScript 运行良好,并返回QObject给 Python。因此QObject是可调用和工作的。但是当我尝试用 替换QObject.staticMetaObjectAttributeHandler.staticMetaObject,我得到了错误:

TypeError: AttributeHandler has no invokable constructor

...表明 AttributeHandler 不可调用。“可调用”是指 JavaScript 可以创建 class 的新实例TrialObject,我希望它是一个在 Python 中创建的类,并继承QObject.

如何注册一个继承QObject的元对象QJSEngine,使其可调用 IE 一个新实例可以在 JavaScript 中实例化?

(PyQt6、Python 3.9、Windows 10)


编辑 1

运行AttributeHandler.staticMetaObject.constructorCount()返回0,而对于正常情况QObject,它返回2,所以我认为问题在于构造函数实际上被元对象系统识别。Q_INVOKABLE中不存在PyQt,所以我尝试__init__用 with装饰pyqtSlot(),但这也没有预期的效果。

0 投票
0 回答
36 浏览

c++ - QMetaType 混淆了名称相同但命名空间不同的两个符号

考虑以下最小示例:

此代码可能会导致崩溃。当调用一个接受const foo::MyStruct&作为参数的槽时,const bar::MyStruct&由于别名不明确,Qt 的元对象系统会提供。

我知道显而易见的解决方法是将MyStruct' 的名称更改为其他名称,以完全避免冲突。那里的问题是我怀疑我不应该这样做,在某些情况下我什至可能无法做到这一点(想象一下由彼此不知道的独立插件提供的两个结构)。

话虽如此,我有几个问题:

  1. 我尝试更改两个别名以包含命名空间限定符,例如qRegisterMetaType<foo::MyStruct>("foo::MyStruct"),但是 Qt 默默地表现得好像我根本没有注册元类型。这对我来说似乎是一个干净的解决方案。为什么不允许这样做?为什么我没有收到警告?

  2. 如果我对以前的方法进行修改并将别名更改为 , 或 之类的东西foo_MyStructfooMyStruct或者MyStruct2甚至不将任何别名传递给函数,这似乎也不起作用。别名参数是否必须存在并与符号名称完全匹配?

  3. 我还有什么其他选择?(没有重命名结构)

干杯!

0 投票
0 回答
78 浏览

c++ - Wy 是 QMetaObject::invokemethod 从错误对象中搜索函数

在我的工作项目中,我遇到了一种特别奇怪的行为。在运行时,当调用 QMetaObject::invokeMethod 时,我得到一个打印,表明程序正在尝试从 QObject 中找到指定的方法,而不是我给它的指针指向的实际类。更奇怪的是,我制作了一个模型,在我看来,它的功能与代码本身的功能大致相同,不同之处在于模型实际上做了预期的事情。我找不到两者之间有意义的差异,也无法弄清楚为什么我的代码无法正常运行。

请原谅所示代码中的一些不良做法。由于与此问题无关的原因,我被迫编辑部分代码,主要是类和库的名称,并且在维护实际代码中的质量方面做得不是很好。这对实际功能没有影响,只有可读性。

我会根据要求提供模型的代码,但这个代码实际上是我遇到问题的代码,所以我觉得添加 g 只会导致不必要的膨胀。

编辑

我是个笨蛋,忘记包含错误消息。请注意,这也与代码库类似地编辑(即类名和一些函数名已更改)

QMetaObject::invokeMethod: No such method QObject::simpleRx(QString,int,client*)

编辑#2 好的,所以问题的根源是主机中缺少 Q_OBJECT 宏。现在我收到一个“QMetaMethod::invoke: Unable to handle unregistered datatype 'int&'”错误,我将在接下来进行研究。

主文件

主控制器.h

主控制器.cpp

客户端.h

客户端.cpp

主机.h

主机.cpp

CMakeLists.txt

我在 Ubuntu 20.04 上运行 Qt 6.1.0

请询问您需要的任何更多详细信息,如果可以,我会提供。

非常感谢您的帮助。

0 投票
1 回答
126 浏览

c++ - 将枚举类添加到 metaObject Qt 5.15 的正确方法

我正在对 Qt 的元对象系统进行一些修改,并且遇到了添加enum class到元对象的问题。我有一个包含一些变量的结构,其中一个是enum class.

我将此结构声明为 a Q_META_TYPE,以便使用元对象系统访问它。这允许我访问结构的属性。这是我的main.cpp

我希望这enumeratorCount()将是 1,但我得到 0。我已经搜索过这个问题,我能找到的大多数示例都有一个类中的结构,以及紧随其后的Q_ENUM声明,如下所示:

但是,这会导致错误。在元对象系统中注册这个枚举的正确方法是什么?

谢谢你的时间。

编辑 我得到的相关错误是:

0 投票
0 回答
27 浏览

c++ - Q_GADGET 中的 Q_GAGDET 的 readOnGadget 未按预期工作

我有一个“顶级” Q_GADGET,在这个里面Q_GADGET,我有一个指向另一个的指针Q_GADGET。我正在尝试使用函数 readOnGadget 来显示两个对象存储的值。我可以在顶层做到这一点Q_GADGET,但是从内部读取的值Q_GADGET是错误的。这是我的代码:

Q_小工具:

主要的:

我从代码中得到的输出是:

我期望 m_x 和 m_y 的值分别为 10 和 25。我传递给的指针readOnGadget似乎是正确的。全局指针仅用于示例。我究竟做错了什么?