问题标签 [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.
qt - Qt:连接信号时得到通知
是否有可能收到信号正在连接到某个插槽的通知?
例如,我们有类 Foo:
在某个地方,有人将它连接起来:
我想在调用 connect() 时调用我的代码,因此我可以在服务器中注册 Foo 以接收将导致发出信号的网络事件。这样,我可以只连接信号,发送方会自动在服务器中注册以接收所需的事件,这比需要手动注册更不容易出错。例如,我可以重新实现 connect():
不幸的是,当使用静态 QObject::connect() 时它不起作用。或者我可以重新实现 QObject::metaObject() 以返回自定义 QMetaObject 子类,其中重新实现了 indexOfSignal() 但这似乎也不可能,并且 indexOfSignal() 也不是虚拟的。
有任何想法吗?谢谢。
c++ - 如何让 QObject::deleteLater() 将对象归零?
通常,当我删除一个对象时,我将其设置为零。这有助于我编写例程以检查对象不为零然后继续。
但是,如果我使用该deleteLater()
功能,我将失去对它的控制。我不知道它是否是一个有效的项目,或者我是否需要创建一个新项目。我找到的解决方案只是单独跟踪状态但是有更好的方法吗?
c++ - Qt:子对象可以在其父对象中组合吗?
在 Qt 中,我可以通过组合将子小部件嵌入到它们的父级中,还是必须使用new
?
文档说,任何派生自的对象QObject
都会在其父对象被销毁时自动销毁;这意味着调用delete
,在上面的示例中会崩溃。
我必须使用以下内容吗?
编辑
答案是多种多样的,基本上可以归结为三种可能性:
- 是的,构图还可以。Qt 可以弄清楚对象是如何分配的,并且只有
delete
堆分配的对象(这是如何工作的?) - 是的,组合是好的,但不要指定父级,因为父级否则会调用
delete
对象(但是没有父级的小部件不会变成顶级窗口吗?) - 不,小部件总是必须在堆上分配。
哪一个是正确的?
c++ - C++ 中 QObject 多重继承和策略/特征设计的问题
我在业余时间构建了一个相当大的插件驱动应用程序,并且遇到了一个显示停止设计缺陷。我的应用程序使用基于策略/特征的设计,但因为我使用 Qt,所以它只是通过 MI(而不是模板和 MI)来完成。其中一些类是纯虚拟的,而另一些则在底层执行最终用户不应该接触的相当关键的功能。
我的问题是其中一些类需要信号/插槽,因此从 QObject 派生,没问题我可以虚拟地从它继承。但是,我遇到的问题是,当我想从 Qt 类派生,然后用我的一个或多个特征扩展它时,例如:
这里 QGLWidget 是从 QObject 派生的,但不是虚拟的,会导致歧义问题。
我考虑了一个桥模式,例如,我在其中创建了Sy_saveable
纯虚拟,然后从中派生出一个Sy_saveable_imp
包含实际实现的桥模式。然后将其用于我的Sy_abstractGLViewport
通过聚合。
这对我来说似乎相当不专业,因为该应用程序是基于插件的,对于我未来的插件编写者来说,将所有接口方法“连接”到聚合实例有点像 PITA。我什至不能通过宏自动化它,因为最终用户可能想要覆盖一个方法。
有没有人解决这个问题的模式?或者不需要 MI 但给我同样的灵活性的模式?这是我个人的爱好项目,我不介意做很多重构——我想把它做好。
qt - 不能在基类中声明 Signal
我有一个 A 类,B 类和 C 类的父类。我有信号:在 B 类和 C 类中声明和使用。但是当我尝试编写其他信号时:在 A 类中,它给了我vtable 引用错误。我无法在 .h 文件中写入 Q_OBJECT 宏,这会导致错误。
qt - Qt:Q_PROPERTY,带有用于 QtScript 访问的指针和前向声明
问题
我正在制作一个项目,使用 Q_OBJECT 和 Q_PROPERTY 从脚本中访问一些对象。我有两个问题:
- 使使用前向声明的类可编写脚本
- 将属性作为指针返回
解释
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*)
,这可以以某种方式使用吗?
问题:
- 我可以以某种方式从不完整的类型中创建 Q_PROPERTY,或者如何避免前向声明?
- 我可以在插槽中返回一个引用吗(可能是一些技巧,例如一个包装指针并“覆盖”脚本的类
operator.
,如果存在类似的东西)或 - 我可以以某种方式将 QVariant(A*) 取消引用到 QtScript 中的 A 吗?
qt - 在多个小部件上显示相同的 QPushButton
我有两个小部件(Real 和 Fake),其中一个有 QPushButton。现在我希望在另一个小部件中显示相同的按钮。我该怎么做?
我不想创建副本,我希望在不更改父级的情况下同时显示相同的 QObject 上的另一个小部件。
例如,在下面我希望“mybutton”同时显示在两个小部件中;
我需要这个的原因是因为我有一堆 MDISubWindows,它们包含一些控件(按钮、复选框......等)。现在我想从这些小部件中选择其中一些控件并创建一个小部件。这样做的原因是,当我只使用一个按钮时,我不想显示我的所有 MDISubwindow 任何建议都非常有帮助。谢谢你。
-简历