为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用Qt的PIMPL习语?

如何使用Qt的PIMPL习语?

C++
aluckdog 2019-07-30 14:27:48
如何使用Qt的PIMPL习语?PIMPL代表P ointer到IMPL ementation。实现代表“实现细节”:类的用户不必关心的东西。Qt自己的类实现通过使用PIMPL惯用法将接口与实现完全分开。然而,Qt提供的机制没有记录。怎么用?我想这是关于Qt中“我如何进行PIMPL”的规范性问题。答案将由下面显示的简单坐标输入对话框界面激发。当我们有任何半复杂的实现时,使用PIMPL的动机就变得明显了。这个问题给出了进一步的动机。即使是一个相当简单的类也必须在其界面中引入许多其他头文件。基于PIMPL的界面非常干净且易读。// CoordinateDialog.h#include <QDialog>#include <QVector3D>class CoordinateDialogPrivate;class CoordinateDialog : public QDialog{   Q_OBJECT   Q_DECLARE_PRIVATE(CoordinateDialog)#if QT_VERSION <= QT_VERSION_CHECK(5,0,0)   Q_PRIVATE_SLOT(d_func(), void onAccepted())#endif   QScopedPointer<CoordinateDialogPrivate> const d_ptr;public:   CoordinateDialog(QWidget * parent = 0, Qt::WindowFlags flags = 0);   ~CoordinateDialog();   QVector3D coordinates() const;   Q_SIGNAL void acceptedCoordinates(const QVector3D &);};Q_DECLARE_METATYPE(QVector3D)基于Qt 5,C ++ 11的接口不需要该Q_PRIVATE_SLOT行。将其与非PIMPL接口进行比较,该接口将实现细节隐藏在接口的私有部分中。请注意必须包含多少其他代码。// CoordinateDialog.h#include <QDialog>#include <QVector3D>#include <QFormLayout>#include <QDoubleSpinBox>#include <QDialogButtonBox>class CoordinateDialog : public QDialog{   QFormLayout m_layout;   QDoubleSpinBox m_x, m_y, m_z;   QVector3D m_coordinates;   QDialogButtonBox m_buttons;   Q_SLOT void onAccepted();public:   CoordinateDialog(QWidget * parent = 0, Qt::WindowFlags flags = 0);   QVector3D coordinates() const;   Q_SIGNAL void acceptedCoordinates(const QVector3D &);};Q_DECLARE_METATYPE(QVector3D)就它们的公共接口而言,这两个接口完全相同。它们具有相同的信号,插槽和公共方法。
查看完整描述

1 回答

  • 1 回答
  • 0 关注
  • 682 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信