问题标签 [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 投票
1 回答
602 浏览

c++ - 无法将 QMetaMethod 与 lambda 连接

我有一个基类 Binded 设置,用于将其中的属性与给定的小部件绑定,例如示例中的 LineEdit。我坚持连接信号和插槽。正如我所看到的,它与如何使用 QMetaMethod 和 QObject::connect的答案中提供的代码相同 ^

在 cpp 中:

我在同一个函数中有一些经典的连接(没有 qmetamethod),但我得到的是

C:\Projects\some\settings.cpp:279: error: no matching function for call to 'BindedSettings::connect(BindedSettings*, QMetaMethod&, BindedSettings*, BindedSettings::bindWtToProp(QLineEdit*, const char*)::) ' 连接(这个,信号,这个,={});

0 投票
1 回答
150 浏览

python - PySide2 在访问 QObject::property() 时崩溃

所以我不确定这是一个错误还是什么,但我花了很长时间来解决这个问题,但无法解决。访问调用QObject::property()函数时会出现问题。这是一个最小的可重现示例:

该程序总是崩溃并显示以下输出:

0 投票
1 回答
263 浏览

qt - Set property value of QObject by index, not name

In my publisher-subscriber class the Qt components subscribe by their property names. The publisher maps the pairs <QObject*,PropertyName (as QString)> to the names of the publishable variables.

On variable change, the list of subscribed QObjects are called using setProperty:

I'd like to optimize the conversion from QString to char*. Also I assume, internally in setProperty the property setter function is found by going through the list of const* and string compare.

QMetaObject provides the method:

which I could use during the subscription to get the index and later on the value change use only Index instead of the string-name.

But how can I invoke the property setter by the index? Is it possible at all?

0 投票
1 回答
621 浏览

qt - 无法解析 Qt 的 QMetaObject::invokeMethod: No such method 错误

我正在尝试开发一个通用函数来确定两个 QObjects 是否相等。为了使这成为可能,被比较的函数必须有一个“equals”方法,该方法比较每个函数中的各种函数值,如果它们都相等则返回true。此外,这个“相等”方法必须用 Q_INVOKABLE 声明。

但是,当我尝试为 'equals' 方法调用 invokeMethod 时,它会失败并显示错误“QMetaObject::invokeMethod: No such method F1::equals(QObject*)(QObject*)”。

这是我的测试项目和文件:

项目文件:

断言1.h

f1.h

主文件

运行测试会产生以下输出:

如何让 invokeMethod 工作?

0 投票
2 回答
782 浏览

c++ - 使用 std::move 将 std::unique_ptr 作为 qt 信号参数传递

我在 Qt 工作,我没有提到它,因为我认为这只是 C++ 问题。

我用共享指针解决了这个问题,所以不要给我解决方案。但这是理解的问题,我想了解为什么它不起作用。

我正在尝试以下操作:

测试.h:

测试.cpp:

Response班级:

我知道std::unique_ptr不能复制,我std::move在这里使用。但尽管如此,我得到一个错误:

在下面的代码片段中moc_test.cpp,它是 Qt 元对象系统的产物:

花了很多时间,但我无法弄清楚为什么会发生这个错误,并且在互联网上没有找到任何有用的东西。

0 投票
1 回答
212 浏览

c++ - 如何检查它是否是由 QMetaType::create() 创建的有效 QObject 指针

我需要转换QVariant为其他用户自定义类。

所有类都必须派生自QObject.

我可以在编译时检查目标类型,因为它是模板,但源是QVariant这样,无法检查。

我的方法:

称之为:

from永远不会为空,但如果userType不是QObject基类,from则不是有效QObject指针,并且调用在调用时崩溃:

我不能dynamic_castvoid*QMetaType::create()

我试过qobject_cast了,from但如果它无效,它不会失败

我如何知道是否是指向派生类QObject* from的有效指针?QObject

0 投票
0 回答
120 浏览

qt - Qt - 编译时检查 qRegisterMetaType() 被称为

‎<br> 问题:有没有办法在编译时检查是否qRegisterMetaType<T>()调用了自定义类型T


自定义类型T需要在 Qt 元类型系统中注册才能用于例如排队连接。

如果建立了这样的连接并触发了信号,则会显示运行时警告:

这很难跟踪,所以我宁愿在编译时检查它。这有可能吗?

(我知道如果可能的话,它可能已经是 Qt 框架本身的一部分,但也许......?)


注意:我知道我可以检查一个类型是否被声明为元类型(检查类型是否被声明为元类型系统(对于 SFINAE)),但这并不能解决我的问题。


代码示例将是:

0 投票
0 回答
96 浏览

c++ - Qt 直接调用 QThread 事件循环的方法

在我的应用程序中,我使用了一个生成自己的线程的非 Qt 类。此对象在设备上侦听并在设备每次收到数据包时调用回调。

在我的设备类(从 QObject 派生)中,我有一个静态函数,它接收回调,然后应该调用实际对象的成员函数。

Device 对象有自己的 QThread,因为我正在后台进行大量分析。如果可能的话,主线程不应该参与。问题是维基状态(https://doc.qt.io/qt-5/qmetaobject.html#invokeMethod

“如果类型是 Qt::QueuedConnection,一旦应用程序进入主事件循环,就会发送一个 QEvent 并调用该成员。”

这听起来像是主线程至少需要处理每个数据包才能将其转发到 Device 对象所在的线程。

难道没有一个选项可以在不使用主线程的情况下调用当前对象所在的 QThread 中的函数吗?

(QThread 肯定有自己的 EventLoop)

0 投票
2 回答
331 浏览

c++ - QMetaObject invokeMethod 的基于函数指针的语法

我正在为我们正在使用的 IPC 库开发一个简单的包装器。

我想将此库中的事件转换为 Qt 插槽上的调用。

现在我有这样的事情:

这工作得很好。但我不喜欢将回调注册为字符串。我更喜欢使用如下语法进行编译时检查:

我知道这个实现。

我要注册的插槽总是只有一个参数并且没有返回值。

我已经发现这个请求可以解决我的问题,但不幸的是这从未实现。这个问题也对我没有帮助,因为我无法修补我们正在使用的 moc。

那么 Qt 使用的所有元魔法真的不可能吗?


编辑:

我找到了一个解决方案,当调用者不知道接收者(我实际上需要什么)时也可以使用:

0 投票
1 回答
526 浏览

c++ - 为什么不能将 Q_OBJECT 与模板类一起使用?

这里有一个类似的问题,正在寻找一种解决方法和一个很好的指南它描述了 Qt 中的元对象系统。但这并不能直接解释为什么不能在元对象系统中使用模板类。这是一个令人讨厌的限制。

有谁知道为什么?