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

qt - Qt:连接信号时得到通知

是否有可能收到信号正在连接到某个插槽的通知?

例如,我们有类 Foo:

在某个地方,有人将它连接起来:

我想在调用 connect() 时调用我的代码,因此我可以在服务器中注册 Foo 以接收将导致发出信号的网络事件。这样,我可以只连接信号,发送方会自动在服务器中注册以接收所需的事件,这比需要手动注册更不容易出错。例如,我可以重新实现 connect():

不幸的是,当使用静态 QObject::connect() 时它不起作用。或者我可以重新实现 QObject::metaObject() 以返回自定义 QMetaObject 子类,其中重新实现了 indexOfSignal() 但这似乎也不可能,并且 indexOfSignal() 也不是虚拟的。

有任何想法吗?谢谢。

0 投票
3 回答
5639 浏览

c++ - 如何让 QObject::deleteLater() 将对象归零?

通常,当我删除一个对象时,我将其设置为零。这有助于我编写例程以检查对象不为零然后继续。

但是,如果我使用该deleteLater()功能,我将失去对它的控制。我不知道它是否是一个有效的项目,或者我是否需要创建一个新项目。我找到的解决方案只是单独跟踪状态但是有更好的方法吗?

0 投票
7 回答
1850 浏览

c++ - Qt:子对象可以在其父对象中组合吗?

在 Qt 中,我可以通过组合将子小部件嵌入到它们的父级中,还是必须使用new?

文档说,任何派生自的对象QObject都会在其父对象被销毁时自动销毁;这意味着调用delete,在上面的示例中会崩溃。

我必须使用以下内容吗?

编辑

答案是多种多样的,基本上可以归结为三种可能性:

  • 的,构图还可以。Qt 可以弄清楚对象是如何分配的,并且只有delete堆分配的对象(这是如何工作的?)
  • 的,组合是好的,但不要指定父级,因为父级否则会调用delete对象(但是没有父级的小部件不会变成顶级窗口吗?)
  • ,小部件总是必须在堆上分配。

哪一个是正确的?

0 投票
1 回答
1883 浏览

c++ - Qt 对 C++0x 枚举类的支持

使用Q_ENUMS我现在可以enum在继承自QObject. 这给了我一些很酷的反射特性enum

我也非常喜欢enum classC++0x 中引入的类型安全。我想知道您是否知道 Qt 开发人员宣布计划支持enum class.

这个问题一般含糊地询问 Qt 对 C++0x 特性的支持。我是专门问的enum class。我意识到,由于 Qt 是跨平台的并且支持许多编译器,因此对 C++0x 的支持将缓慢推出,但这enum class是对核心语言的一个非常好的简单改进!

0 投票
3 回答
3883 浏览

c++ - 带有复制和赋值的 C++ Qt 反射

正如文档和许多其他人所解释的那样, a具有QObjectQObject标识,因此隐藏了它的复制构造函数和赋值运算符。

但是,我并不是QObject因为它的动态属性功能或信号/插槽功能而派生出来的。我只想要反思,或者访问的能力Foo::staticMetaObject

然后我不能复制Foo

在这种情况下,允许复制和分配的最佳方法是什么?我绝对需要编写一个复制构造函数和赋值运算符吗?他们会是什么样子?反射还会起作用吗?

0 投票
2 回答
2804 浏览

c++ - 没有复制构造函数的 C++ 赋值运算符

问题:我可以定义一个赋值运算符而不是复制构造函数吗?对于内部类(未在 API 中公开),这仍然是一个糟糕的设计实践吗?

我需要它的原因:正如这个问题所提到的,QObject将其复制构造函数和赋值运算符设为私有,这样如果子类尝试使用其中任何一个,则会在编译时发出错误。

但是,我需要定义一个赋值运算符以复制“值”(而不是文档描述Qobject“身份” 。我不在任何地方使用此类的复制构造函数。

我不想编写复制构造函数的原因是它会复制我无论如何都不会使用的代码。

0 投票
1 回答
1478 浏览

c++ - C++ 中 QObject 多重继承和策略/特征设计的问题

我在业余时间构建了一个相当大的插件驱动应用程序,并且遇到了一个显示停止设计缺陷。我的应用程序使用基于策略/特征的设计,但因为我使用 Qt,所以它只是通过 MI(而不是模板和 MI)来完成。其中一些类是纯虚拟的,而另一些则在底层执行最终用户不应该接触的相当关键的功能。

我的问题是其中一些类需要信号/插槽,因此从 QObject 派生,没问题我可以虚拟地从它继承。但是,我遇到的问题是,当我想从 Qt 类派生,然后用我的一个或多个特征扩展它时,例如:

这里 QGLWidget 是从 QObject 派生的,但不是虚拟的,会导致歧义问题。

我考虑了一个桥模式,例如,我在其中创建了Sy_saveable纯虚拟,然后从中派生出一个Sy_saveable_imp包含实际实现的桥模式。然后将其用于我的Sy_abstractGLViewport通过聚合。

这对我来说似乎相当不专业,因为该应用程序是基于插件的,对于我未来的插件编写者来说,将所有接口方法“连接”到聚合实例有点像 PITA。我什至不能通过宏自动化它,因为最终用户可能想要覆盖一个方法。

有没有人解决这个问题的模式?或者不需要 MI 但给我同样的灵活性的模式?这是我个人的爱好项目,我不介意做很多重构——我想把它做好

0 投票
1 回答
189 浏览

qt - 不能在基类中声明 Signal

我有一个 A 类,B 类和 C 类的父类。我有信号:在 B 类和 C 类中声明和使用。但是当我尝试编写其他信号时:在 A 类中,它给了我vtable 引用错误。我无法在 .h 文件中写入 Q_OBJECT 宏,这会导致错误。

0 投票
1 回答
3827 浏览

qt - Qt:Q_PROPERTY,带有用于 QtScript 访问的指针和前向声明

问题

我正在制作一个项目,使用 Q_OBJECT 和 Q_PROPERTY 从脚本中访问一些对象。我有两个问题:

  1. 使使用前向声明的类可编写脚本
  2. 将属性作为指针返回

解释

1. 为什么要前向声明?

类 B 获得对 A 的前向声明,因为由于模板,A 需要头部中的完整 B 类型。B 只需要头部中的不完整类型(A*),因此前向声明是有效的。

2. 为什么要返回一个指针?

我们无法返回副本,因为我们需要访问脚本中的实际对象。我们不能返回引用,因为Qt 不允许槽返回引用- 它们的类型将被忽略,它们只会返回 void*。

代码

可以在 pastebin或 ZIP 存档或最小示例的ZIP 存档上下载完整的代码,用于测试/播放:我需要为前向声明和 MOC 拆分文件。我添加了一个 Makefile 来测试它。制作部门:g++、moc、Qt。

重要部件

脚本中的错误行:

编译错误

当我注释掉上面的 Q_PROPERTY 时,此错误消失。

脚本异常

当省略 Q_PROPERTY 并将 GetA() 方法作为脚本中的插槽调用时,我收到以下异常:

注册 A* 时,qRegisterMetaType<A*>("A*");此更改为:

这表明 GetA() 不返回 A 对象,或者以某种方式返回指针,但脚本无法取消引用它。GetA() 然后实际上返回 a QVariant(A*),这可以以某种方式使用吗?

问题:

  1. 我可以以某种方式从不完整的类型中创建 Q_PROPERTY,或者如何避免前向声明?
  2. 我可以在插槽中返回一个引用吗(可能是一些技巧,例如一个包装指针并“覆盖”脚本的类operator.,如果存在类似的东西)
  3. 我可以以某种方式将 QVariant(A*) 取消引用到 QtScript 中的 A 吗?
0 投票
5 回答
5438 浏览

qt - 在多个小部件上显示相同的 QPushButton

我有两个小部件(Real 和 Fake),其中一个有 QPushButton。现在我希望在另一个小部件中显示相同的按钮。我该怎么做?

我不想创建副本,我希望在不更改父级的情况下同时显示相同的 QObject 上的另一个小部件。

例如,在下面我希望“mybutton”同时显示在两个小部件中;

我需要这个的原因是因为我有一堆 MDISubWindows,它们包含一些控件(按钮、复选框......等)。现在我想从这些小部件中选择其中一些控件并创建一个小部件。这样做的原因是,当我只使用一个按钮时,我不想显示我的所有 MDISubwindow 任何建议都非常有帮助。谢谢你。

-简历