问题标签 [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 中复制对象?
我正在使用 Qt 并且有一些真正的基本问题。我创建了自己的小部件 MyTest ,它有一个变量obj
。我需要obj
从小部件外部的对象设置此变量,以便复制该变量而不仅仅是指向另一个对象的指针。我收到一条错误消息,无法弄清楚如何做这些基本的事情。这是我正在使用的代码:
我的测试.h:
我的测试.cpp:
主.cpp:
c++ - QObject 克隆
我知道 Qobjects 应该是身份而不是值,例如,您不能复制它们,并且默认情况下,复制构造函数和赋值被禁用,如 qt 文档中所述。但是是否可以使用克隆方法从现有的 QObject 中创建一个新的 QObject?这会是逻辑错误吗?如果我说
或者
并且克隆方法会复制成员等内容,这是错误的吗?
如果可以,我可以编写自己的复制构造函数和赋值运算符吗?
注意:我实际上想尝试使用继承 qobject 的类。
c++ - 为什么我能够为 QObject 子类创建复制构造函数并重载赋值运算符?
我的印象是 QObject 禁用了复制构造函数和赋值运算符......为什么我能够编译包含这两者的 QObject 派生?
c++ - Q_OBJECT 链接器错误!
我在构建应用程序时收到以下链接器错误。
HIMyClass.obj:: error: unresolved external symbol "public: virtual struct QMetaObject const * __thiscall CHIMyClass::metaObject(void)const" (?metaObject@CHIMyClass@@UBEPBUQMetaObject@@XZ) 找不到文件:HIMyClass.obj
HIMyClass.obj:: error: unresolved external symbol "public: virtual void * __thiscall CHIMyClass::qt_metacast(char const *)" (?qt_metacast@CHIMyClass@@UAEPAXPBD@Z) 找不到文件:HIMyClass.obj
HIMyClass.obj:: 错误:未解析的外部符号“public: virtual int __thiscall CHIMyClass::qt_metacall(enum QMetaObject::Call,int,void * *)” (?qt_metacall@CHIMyClass@@UAEHW4Call@QMetaObject@@HPAPAX@Z)找不到文件:HIMyClass.obj
我的班级声明就像
当我评论 Q_OBJECT 时,链接器错误消失(显然我无法使用信号和插槽)。我使用 Qt Creator 作为 IDE 和 Qt 4.5.3。当我给Rebuild All时,肯定会调用QMake 。我想,它的 moc_* 文件的生成是问题所在。我使用 Windows XP 和 cl 作为编译器。
此链接器错误背后的原因可能是什么?
c++ - QT:将我的域对象基于 QObject 是一个好主意吗?
我对将 QT 框架与 C++ 结合使用相当陌生。我想知道:将我的域类基于 QObject 是个好主意吗?或者我应该只对层次结构中较高的类执行此操作?(更接近用户界面级别)。QT 文档对此并不清楚:
取自 QT 文档:
元对象系统是 C++ 扩展,使该语言更适合真正的组件 GUI 编程。
显然,我想以一种结构良好的方式构建我的应用程序。在过去的几天里,我一直在浏览 QT 文档以找到这个问题的答案。我不想犯一些基本的错误,这将使我的应用程序永远跛行;-)。
我已经查看了 QObject 和 Qt 对象模型的基本文档。我还发现了一篇关于新鲜肉类的文章,它有帮助,但并没有真正帮助我得出结论。让我感到困惑的另一件事是 QT 本身在这个问题上似乎并不一致,因为并非所有 QT 类都使用 QObject 作为基类。
在我看来,使用 QObject 作为基类的优势:
- 等级制度
- 信号和插槽
- 特性
- 能够使用受保护的指针
- 国际化
但是,在我的大多数域类中,我不需要任何这些功能。对此有最佳实践规则吗?或者规则应该是:如果您需要上述任何一点,请使用它?
希望我没有让这太混乱:-)
qt - 非 QObject 派生类“总是”应该放在堆栈上吗?
来自 Symbian 世界,我习惯于尽可能多地使用堆以避免耗尽堆栈空间,尤其是在处理描述符时。CBase 派生类总是在堆上动态分配,因为如果不是,它们的成员变量将保持未初始化状态。相同的约定是否适用于 QObject 派生类?
在 Qt 中,将例如 QString 放在堆栈上似乎很常见。当 QString 充当堆栈上的容器时,字符串内容是否放在堆上,还是所有内容都放在堆栈上?
c++ - 为什么不使用 Q_OBJECT 宏编译(链接)?
我用 PyQt 制作了一个项目的原型并让它在那里工作,现在我正在尝试将它转换为 C++ 并且遇到了一些问题。
如果我不放入 Q_OBJECT 宏,它会编译并工作,但如果我将其注释掉,我会收到以下错误:
这是标题:
第二个问题是如果我在这里省略 Q_OBJECT 宏会发生坏事吗?
是的,我知道将 QGraphicsScene 称为“视图”是愚蠢的。
visual-studio - cpp 文件中的 Qt、CMake、Visual Studio 和 Q_OBJECT
我正在为 Windows 平台使用 Qt 4.6、CMake 2.8 和 Visual Studio 2008 开发一个大型项目。
就构建系统而言,它都是标准的东西:我正在使用 CMake 的QT4_WRAP_CPP
宏从头文件生成 moc 文件,然后将其链接到add_executable
命令中的最终可执行文件。一切都按预期工作。
此设置的唯一限制是我无法 Q_OBJECT
在.cpp文件中定义小部件或帮助程序。这对于应该出现在使用它们的位置旁边的小型、特定于上下文的帮助器类来说非常方便。
我试图将整个源文件列表(.h和.cpp)传递给QT4_WRAP_CPP
,而不仅仅是头文件,但这不起作用(链接失败,因为一些与 moc 相关的符号未定义)。
我认为问题在于,对于给定的一对文件foo.h和foo.cpp,QT4_WRAP_CPP
宏将在同一目录中生成相同的 moc 文件(moc_foo.cxx),显然这意味着第一个文件将被覆盖第二个,因此符号将在链接时丢失。
有没有办法解决或解决这个问题?例如,我尝试为表单的foo.cpp添加特定规则
然后添加
在foo.cpp的末尾。我认为这应该可行,但是唉,Visual Studio 只允许每个文件有一个构建规则,并且.cpp文件已经有一个构建规则(编译到目标文件),所以这种方法不起作用,至少在 Visual Studio 中是这样。
我的另一个想法是创建一个新的宏,比如说QT4_WRAP_CPP_WITH_PREFIX
,基于QT4_WRAP_CPP
(在share/cmake-2.8/Modules/Qt4Macros.cmake中定义),它将采用一个额外的前缀参数并将这个前缀添加到生成的 moc文件。这样,我会调用QT4_WRAP_CPP_WITH_PREFIX
两次,一次用于.h文件,一次用于.cpp文件,具有不同的前缀。我只是不喜欢这种方法,因为我会弄乱 CMake 的 Qt 支持的内部结构,而不是使用公共 API。
有更好的主意吗?
欢呼,弗朗茨
c++ - When should Q_OBJECT be used?
The documentation states that:
The Q_OBJECT macro must appear in the private section of a class definition that declares its own signals and slots or that uses other services provided by Qt's meta-object system.
But exactly what does that mean? On which QObject-derived classes can I safely omit it? Will problems arise if you omit Q_OBJECT on a QObject-derived class, and then inherit from that one? Basically I would like a little more information on when I can omit it from my Qt classes.
c++ - Qt 接口或抽象类和 qobject_cast()
我有一组相当复杂的 C++ 类,它们是从 Java 重写的。所以每个类都有一个继承类,然后它还实现了一个或多个抽象类(或接口)。
是否可以使用qobject_cast()
从类转换为接口之一?如果我从 派生所有接口QObject
,则会由于QObject
引用不明确而出现错误。但是,如果我只有从 继承的基类QObject
,则不能使用qobject_cast()
,因为它与QObject
s 一起使用。
我希望能够在插件和它们的接口引用的 DLL 之间抛出类。