如何将 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 的子类一起使用的主要内容,如果未能解决你的问题,请参考以下文章

d指针中的“d”代表啥?

Qt 中的实现指针 (PIMPL)

何时在 C++ 中的嵌套类上使用 Pimpl 模式,反之亦然?

将 pimpl 与 Templated Class 和显式实例化的模板一起使用

将 const std::unique_ptr 用于 pimpl 习惯用法

pImpl设计如何将文件编译关系降低