QTreeView への垂直ヘッダーの追加
-
21-09-2019 - |
質問
私は持っています QTreeView
サブクラス (そして QAbstractItemModel
サブクラス) には素晴らしい水平ヘッダーがあります。これに合わせて、垂直ヘッダー (左側から下に向かう) を追加したいと思います。しかし、それとは異なります QTableView
これには個別の垂直方向 (setVerticalHeader()
) と水平ヘッダー (setHorizontalHeader()
), QTreeView
単一のヘッダーのみを許可します (setHeader()
).
左端の列をヘッダーであるとみなして、別の背景色でレンダリングできることはわかっています (行のサイズを変更したり再配置したりする機能は必要ないので、これらの特別な動作を実装する必要はありません) )。しかし、それは地元のスタイルを考慮していません。たとえば、私のシステムではヘッダーにわずかなグラデーションがあり、ほぼ 3D のように見えます。
したがって、適切な垂直ヘッダーを追加する方法を探しています(これはのサブクラスになると思います) QHeaderView
) または、ヘッダーを左端の列の下にレンダリングしますが、それを正しい方法でレンダリングします。
解決
あなたはおそらく右のあなたは「ふり」をしていますが、あなたは水平ヘッダとして良いように見えるためにそれを描画することができるはずます。
何をする必要があるこれらの細胞のためのpaintEvent
を担当した後、カスタムコントロールを描画する現在のスタイルを使用しています。ような何かます:
//QWidget* w is the widget who's style you want
QPainter painter(this);
QStyleOptionHeader opt;
opt.initFrom(this);
opt.state = QStyle::State_None;
opt.orientation = Qt::Vertical;
opt.state |= QStyle::State_Vertical;
if (w->isEnabled())
opt.state |= QStyle::State_Enabled;
opt.state |= QStyle::State_Active;
w->style()->drawControl(QStyle::CE_Header, &opt, &painter, w);
あなたがしたいセルのペイントイベントを担当するための最も簡単な方法は、カスタムアイテムデリゲートを作成し、virtual void paint ( QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index ) const = 0
メソッドを再実装することです。あなたが気にしてスーパークラスに残りを渡すインデックスにあなただけのゲートあなたの絵を(このクラスのQtのドキュメントを参照してください)。