如何将 pimpl 成语与 Qt 和 QObject 的子类一起使用
Posted
技术标签:
【中文标题】如何将 pimpl 成语与 Qt 和 QObject 的子类一起使用【英文标题】:How to use the pimpl idiom with Qt and subclasses of QObject 【发布时间】:2016-07-26 13:03:23 【问题描述】:我想知道在 Qt 对象中实现 pimpl idiom 的最简单方法。我想要的是这样的:
pimpl.h:
class B;
class A: public QObject
B *b;
pimpl.cxx:
class B: public QObject
现在,很明显,Qt 不会传递 B 类来为其创建 moc。如何处理?我想明确地在 .cxx 中实现 B。
【问题讨论】:
How to use the Qt's PIMPL idiom?的可能重复 @TheDarkKnight 据我所知,链接答案中没有提到 impl 类本身是QObject
,所以我投票决定保持开放。
【参考方案1】:
您可以创建一个 pimpl-private.h,其中包含 B 的定义,并且仅包含在 pimpl.cxx 中,其他任何地方都没有。然后你可以在这个头文件上运行 moc。
【讨论】:
是的,这很好。但是,如果可能的话,我一直在寻找一种技巧,将其保存在 .cxx 文件中,因为我更习惯了它,并且大部分时间都不必在其中声明/包含类型。 @code_not_yet_complete:见***.com/questions/34928933/…【参考方案2】:可以在.cpp文件中添加代码
#inlude "pimpl.moc"
在“pimpl.cxx”的末尾(!)并重新运行 qmake。这将生成一个 Makefiule 规则以通过 moc 运行文件并将输出放入“pmipl.moc”,这样一切都会神奇地工作。
【讨论】:
以上是关于如何将 pimpl 成语与 Qt 和 QObject 的子类一起使用的主要内容,如果未能解决你的问题,请参考以下文章
何时在 C++ 中的嵌套类上使用 Pimpl 模式,反之亦然?
将 pimpl 与 Templated Class 和显式实例化的模板一起使用