2016-07-27 6 views
3

私は、純粋な仮想メソッドQStyledItemDelegate::paint定義:QStyledItemDelegateにQListViewのcurrentIndexを取得する方法::塗料は、()

void FooViewDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const 
{ 
    bool selected = option.state & QStyle::State_Selected; 
    // ... 
    // drawing code 
} 

しかし、私が知っている方法を見つけ出すcant't描画アイテム電流または無(同じです項目はQListView::currentIndex()からです)。

答えて

1

Qt MVCは理論的には、デリゲートが使用しているビュー(QListViewまたはQTableView)を知るべきではないため、このような用途には設計されていません。

したがって、この情報をデリゲートの内部に保存することをお勧めします(モデルはセヴァラルビューで使用できるため)。 Foxの例(擬似コード):

class FooViewDelegate : ... 
{ 
private: 
    QModelIndex _currentIndex; 

    void connectToView(QAbstractItemView *view) 
    { 
    connect(view, &QAbstractItemView::currentChanged, this, &FooViewDelegate ::onCurrentChanged); 
    } 

    void onCurrentChanged(const QModelIndex& current, const QModelIndex& prev) 
    { 
    _currentIndex = current; 
    } 

public: 
    void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const 
    { 
     bool selected = index == _currentIndex; 
     // ... 
     // drawing code 
    } 

} 
+0

このアイデアを理解してください。ところで、QListViewではどのようにデフォルトで動作しますか?彼らは同じトリックを使用していますか? –

+0

多分、私は知らない。しかし、 'QListWidget'はそれ自身のモデルを内部にカプセル化します。あなたは正確な答えを見つけるためにQtコードを見ているかもしれません。 –

+1

答えから古いアイデアを削除してください。 SOはあなたの編集を追跡し、全体の "編集:..." "コンベンション"は本当に愚かです。誰でもあなたの編集履歴に興味があれば、リビジョントラッキングシステムを閲覧することができます。 –

0

あなたは正しい軌道に沿っている:焦点と

auto current = option.state & QStyle::State_HasFocus; 

項目が現在の項目です。

+0

私はこれを試しましたが、別のウィジェットにフォーカスを移すまで機能します。 –

+0

@VladimirGamalian 'QStyle :: State_Active'を試してみてください。それがうまくいかず、 'option.state'に必要なデータがあると仮定しても、それを16進数でダンプし、現在の項目を示すビットを確認してください:' qDebug()<< QString :: number((uint) .state、16); ' –

+0

良い考えですが、別のウィジェットにフォーカスを移した後、残念ながら" 1 "、" 1 "、" 1 "、" 1 "、" 1 " –

1

デリゲートの親はビューであり、ビューから現在のインデックスを直接取得できます。

void FooViewDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const 
{ 
    bool selected = index == parent()->currentIndex(); 
} 
関連する問題