2017-05-24 260 views
2

我想覆蓋函數drawBranches() in QTreeView
我分類了QTreeView類,然後我複製drawBranches()函數從here。在這個函數改變任何事情之前,我希望確保它工作第一,但構建失敗,出現此錯誤:Qt - 覆蓋QTreeView :: drawBranches()

error: 'const QTreeViewPrivate* QTreeView::d_func() const' is private 
inline const Class##Private* d_func() const { return reinterpret_cast<const Class##Private *>(qGetPtrHelper(d_ptr)); } \ 

這裏是我的代碼:

class MyTreeView : public QTreeView 
{ 
    Q_OBJECT 
public: 
    MyTreeView(QWidget *parent =0) : QTreeView(parent) {} 
    void drawBranches(QPainter * painter, const QRect &rect, const 
         QModelIndex &index)const 
    { 
     Q_D(const QTreeView); 
     const bool reverse = isRightToLeft(); 
     const int indent = d->indent; 
     const int outer = d->rootDecoration ? 0 : 1; 
     const int item = d->current; 
     const QTreeViewItem &viewItem = d->viewItems.at(item); 
     int level = viewItem.level; 
     QRect primitive(reverse ? rect.left() : rect.right() + 1, rect.top(), indent, rect.height()); 

     ....// Moore lines that I copied 

      else 
       opt.state &= ~QStyle::State_MouseOver; 
      style()->drawPrimitive(QStyle::PE_IndicatorBranch, &opt, painter, this); 
      current = ancestor; 
      ancestor = current.parent(); 
     } 
     painter->setBrushOrigin(oldBO); 
} 

};

有許多行,其中d指針被使用並且它是私有的,e.g d->indent;

如何在不違反私人角色的情況下獲得對此指針的引用?

爲什麼我要重寫這個功能:我想隱藏的,除了那些誰擁有水平(高級別)的所有項目的展開/摺疊指標,我想通過重寫這個功能,我可以做到這一點。

感謝

回答

1

您需要諮詢reference on using Qt PIMPL idiom

每個d_func是私有的。你需要申報你自己的。你的是一個特例,因爲你不是從QTreeViewPrivate派生的,因此返回的類型仍然是QTreeViewPrivate*。 Qt提供了一個方便的宏做的工作適合你:不是從隨機庫複製代碼

// Interface 
#include <QTreeView> 

class MyTreeView : public QTreeView 
{ 
    Q_OBJECT 
    Q_DECLARE_PRIVATE(QTreeView) 
public: 
    MyTreeView(QWidget * parent = {}) : QTreeView{parent} {} 
protected: 
    void drawBranches(QPainter *, const QRect &, const QModelIndex&) const override; 
}; 
// Implementation 
#include <private/qtreeview_p.h> 

void MyTreeView::drawBranches(QPainter * painter, const QRect &rect, const 
           QModelIndex &index)const 
{ 
    Q_D(const QTreeView); 
    ... 
} 

此外,你應該把它複製from the official mirror

+0

感謝回覆和感謝提示:''從官方鏡像'。我有一個問題與QT + = gui-private拒絕包含,但我想我可以解決它。 – Phiber

+0

添加QT + =小部件 - 私人而不是gui-private讓它起作用 – Phiber