问题标签 [qobject]

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 回答
2582 浏览

xcode - 如何在 Xcode 中使用 Q_OBJECT 宏编译头文件?

我在 Xcode 中创建了与 Qt 框架链接的 C++ 项目。hello world 程序运行良好。当我添加从 QObject 派生的类并添加 Q_OBJCET 宏时,出现链接错误。

班级是

我的对象.h

我的对象.cpp

我知道我应该先使用 moc 编译 MyObject.h 并将生成的 moc_MyObject.cpp 添加到 Xcode 项目中。

在 Microsoft Visual Studio 中,我可以将此头文件配置为使用 moc 自定义工具进行编译。并将生成的 cpp 文件添加到 VS 项目中。

但这是 Xcode。我的问题是:在 Xcode 中是否有等效的方法来编译包含 Q_OBJECT 宏的头文件?

0 投票
2 回答
2247 浏览

c++ - Qt:RemoveWidget 和对象删除

我一直在阅读 Qt 文档并使用 qobject 树。我想知道是否有一种方法可以从树中删除小部件,从而将它们从内存中删除。

当相互嵌入 qwidgets/qobjects 并创建树时,从 qlayouts 中删除带有 removeWidget 的小部件将在 gui 中可视地删除它们,但是该对象仍保持连接到父 qobject(object->parent() 不是 0),只有在删除其父级(例如超出范围)后才会删除它。我只能看到一个 qwidget 只有在应用程序终止时才能被销毁,其中顶部小部件将其下面的所有内容(或者如果对象超出范围)。

例如,假设有一个具有 2 个阶段的主窗口:第一个具有从一个父级嵌入的大约 100 个对象,另一个具有 200 个。应用程序从第 1 阶段开始并移动到第 2 阶段,它永远不会回到第 1 阶段. 如果我想让这有点效率,我会尝试杀死阶段 1 中的所有对象(100 个对象),但是因为它们附加到主窗口的根节点,即使使用“removeWidget”也无法销毁它。

我还尝试接收在没有“new”运算符的情况下创建的小部件的指针,如果我删除该对象,应用程序将崩溃,因为它会调用析构函数两次。

我的问题是,有没有办法删除 qobject 树中的节点(该节点没有被删除,因为它超出范围或应用程序终止时)?

对不起,如果这没有多大意义。提前致谢。

编辑:

对不起,如果我给出了错误的想法。我的问题是在应用程序终止之前或对象超出范围之前从内存中删除一个节点。这是一个例子(可能不是那么好)。

0 投票
1 回答
2058 浏览

qt - 生成的 moc 名称不正确

我正在开发一个使用 cmake 的基于 Qt 的项目。我生成的所有 moc 文件都已命名*.moc,但我有一些文件,它们生成的 moc 文件具有名称moc_*.cpp,而不是*.moc. 为什么会发生这种情况以及如何修复这些文件。

编辑:

  • 我想说这些类继承自 QObject 并具有 Q_OBJECT 和 Q_DECLARE_PUBLIC 宏,除非它们有 .moc,否则它们不会与我一起编译。

  • 我必须在我的 .cpp 文件中包含 .moc 文件。

- 让我发疯的事情是我有一个相同的类(与我的类相同的实现)生成一个 .moc 但我的类生成 moc_*.cpp。

0 投票
1 回答
610 浏览

c++ - Qt:meta.enumeratorCount() 没有元数据用于 Q_OBJECT 中的枚举,为什么?

我有以下课程,我尝试在其中获取一些元数据enum MyEnum。但是,当循环meta.enumeratorCount()其计数始终为 0 时。基本上我在这里遵循这个示例。为了找到问题,我也尝试了同样的方法,同样的问题 - 方法计数 0。代码编译,没有错误没有警告。

一定是一个愚蠢的错误....也许你可以帮助我

0 投票
0 回答
275 浏览

enums - Qt-fy 现有枚举与 Qt 元数据一起使用

假设我有一个现有的enum X { A, B }并希望将它与 Qt 元数据一起使用,例如QMetaObject/ QMetaEnum

如果我enum在一个Q_OBJECT类中定义我的,一切都很好,即我可以MyEnum 通过元数据系统检索。但是我怎样才能使X元数据系统可用呢?

  1. 这是以下内容的后续:Qt: Meta.enumeratorCount() 没有元数据用于 Q_OBJECT 中的枚举,为什么?
  2. 动机:realenum X包含很多异常代码,我想使用元数据系统来获取原始描述性文本,和这里差不多。原件enum不是(!)一个Q_OBJECT
0 投票
2 回答
11923 浏览

c++ - QThread finished() 连接到 QObject 的删除器

在这里问这个问题之前,我想了很多,阅读了很多文章。没有一篇文章给我一个正确的答案。

http://mayaposch.wordpress.com/2011/11/01/how-to-really-truly-use-qthreads-the-full-explanation/

Worker 对象具有新线程的亲和性。

  1. 工人完成信号将调用quit()线程。这将结束线程的事件循环并启动线程完成信号。

  2. 工人finished信号连接到工人deleteLater()。根据deleteLater()文档

计划删除此对象。当控制返回事件循环时,该对象将被删除。如果调用此函数时事件循环没有运行(例如deleteLater(),在之前对对象调用过QCoreApplication::exec()),则一旦启动事件循环,该对象将被删除。

请注意,进入和离开新的事件循环(例如,通过打开模式对话框)不会执行延迟删除;对于要删除的对象,控件必须返回到从中deleteLater()调用的事件循环。

注意:多次调用该函数是安全的;当第一个延迟删除事件被传递时,该对象的所有未决事件都将从事件队列中删除。**

所以当没有事件循环时,因为线程已经退出并且它已经提出了完成信号,我们将不再再次启动同一个线程。在这种情况下,deleteLater()将永远不会处理,因为事件循环不存在,并且工作对象根本不会被删除。这不会造成内存泄漏。?

如果我们认为交换两条线可以解决问题,那么我还有另一个问题。QT 明确指出发出信号时调用槽的顺序是不确定的

上面提到的文章链接中有一堆评论。甚至作者也无法完全回答这个问题

0 投票
1 回答
1259 浏览

qt - Qt - Q_OBJECT 和宏

Qt,我们知道那Q_OBJECT是一个在这种情况下,宏是什么意思?特别是我发现这个词可能有几个不同的定义。

谢谢。

0 投票
1 回答
2257 浏览

c++ - QObject 在删除时是否区分堆栈和堆分配的子项?

根据 Qt 文档:

QObjects 在对象树中组织自己。当您以另一个对象作为父对象创建 QObject 时,该对象将自动将自身添加到父对象的 children() 列表中。父级获得对象的所有权;即,它将自动删除其析构函数中的子级。

对我来说,这意味着当 QObject 被删除时,它会遍历并调用它存储在其子列表中的所有指针的 delete。

然而,子节点没有必要被动态分配,使用堆栈分配的对象构建 QObject 树是完全合法的。

根据标准规范,对不指向动态分配对象的指针调用 delete 是未定义的行为,这可能导致从“无”到程序崩溃的任何事情。

IMO 不太可能 QObject,它几乎是整个 Qt 类集合的支柱,依赖于可能产生未定义行为的东西。

那么,QObject 在删除时是否区分栈和堆分配的孩子呢?如果是这样,究竟如何?

0 投票
2 回答
6019 浏览

c++ - QSharedPointer 和 QObject::deleteLater

我有一种情况,一个QSharedPointer托管对象表示它已经完成了它的目的并准备好很快删除(在执行后离开函数发出我的readyForDeletion信号)。使用普通指针时,我只调用对象,但是使用-managed 实例QObject::deleteLater是不可能的。QSharedPointer我的解决方法如下:

这很好用,但是使用这种方法有很多开销(分配一个新的QObject等等)。有没有更好的解决方案来处理这种情况?

0 投票
1 回答
189 浏览

qt - 如何使 Qt 中的类既可编写脚本又可序列化?

我正在尝试编写一个具有两个基本特征的类:

  • 它需要是可编写脚本的——该类包含许多用Q_INVOKABLE脚本装饰的属性和方法。
  • 它需要可序列化,以便可以注册以qRegisterMetaTypeStreamOperators()存储在QVariants 中。

据我所知,QObject为了使类可编写脚本,我需要派生自。但是,为了使用 注册该类qRegisterMetaTypeStreamOperators(),该类似乎需要有一个默认的复制构造函数——这是QObject派生类所不能具备的。

有没有办法实现这两个目标?