2

私は、d-pointer全体がどのように機能するかを理解しようとしています。ほとんどの部品を入手しましたが、現在問題に直面しています。

ここの人のようにDpointer の継承私は、d-pointers を使用してクラスを継承したいと考えています (実際には QProcess です)。

dポインタにアクセスする関数はprivateなので、単純な継承ではアクセスできません。私の考えは、再び Q_DECLARE_PRIVATE マクロを使用して関数を取得し、それにアクセスすることです。これは機能しますか?試してみる前に、これが機能するかどうかわからないので、いくつかのヒントが必要です.

(ライセンスの問題全体を回避するためにこれが必要です。)

MyProcess.h

#ifndef MYPROCESS_H
#define MYPROCESS_H

class QProcessPrivate;

class MyProcess : public QProcess {
   public:
     MyProcess(QObject *parent = 0);

   protected:
     Q_DECLARE_PRIVATE(QProcessPrivate);

};

#endif /* WIDGET_H */

MyProcess.cpp

#include "myprocess.h"

MyProcess::MyProcess(QObject *parent = 0)
      : QProcess(parent) {
}

MyProcess::setPid(Q_PID pid) {
    Q_D(const QProcess);
    d->pid = pid;
}
4

2 に答える 2

1

d_ptr.data() でアクセスできます。d_ptr へのアクセスが必要な Qt ソース コードを再コンパイルせずに、QML の動作を拡張したいと考えています。継承クラスの QDeclarativeTextEdit の d_ptr で QTextDocument を取得する方法は次のとおりです。

QT_FORWARD_DECLARE_CLASS(QDeclarativeTextEditPrivate)
class MyTextEdit : public QDeclarativeTextEdit
{
  ...
  void aMethod()
  {
    QDeclarativeTextEditPrivate *d = reinterpret_cast<QDeclarativeTextEditPrivate *>(QDeclarativeItem::d_ptr.data());
    QTextDocument *d_doc = d->document;
    ...
  }
};

ところで、クラスを継承せずに d_ptr を取得することもできます。たとえば、継承なしで QDeclaractiveTextEditPrivate で QTextDocument を取得する方法は次のとおりです。

#include <QtGui/QGraphicsItem>
QT_FORWARD_DECLARE_CLASS(QGraphicsItemPrivate)
class DQGraphicsItem : public QGraphicsItem
{
  DQGraphicsItem() {}
public:
  QGraphicsItemPrivate *d() const { return d_ptr.data(); }
};

inline QGraphicsItemPrivate *d_qgraphicsitem(const QGraphicsItem *q)
{ return static_cast<const DQGraphicsItem *>(q)->d(); }

#include <qt/src/declarative/graphicsitems/qdeclarativetextedit_p.h>
#include <qt/src/declarative/graphicsitems/qdeclarativetextedit_p_p.h>

inline QDeclarativeTextEditPrivate *d_qdeclarativetextedit(const QDeclarativeTextEdit *q)
{ return static_cast<QDeclarativeTextEditPrivate *>(d_qgraphicsitem(q)); }

inline QTextDocument *d_qdeclarativetextedit_document(const QDeclarativeTextEdit *q)
{ return d_qdeclarativetextedit(q)->document; }
于 2014-04-06T05:46:32.597 に答える