Qtを使ってプロジェクトを始めています。ビューに次のいくつかを実行させるために、2つのアプローチを試みています。この質問には、QTreeViewから継承するアプローチが含まれます。
QTreeViewの機能が気に入っています。追加機能が欲しいだけです。
まず、他のカテゴリを含むカテゴリを表示できる階層ツリービューを作成します。列が右に行くほど、最も具体的になるまで、列がより具体的になります。メトリックは、最も具体的な列を含む行に表示されます。一般化された各列を含むビュー行は太字で表示され、モデル(またはビュー?)によって計算された各メトリックの要約が含まれます。メトリックは、最も具体的な列に関して各行のモデルに含まれます。
たとえば、次のデータ(数字を含む最後の3列)を持つモデルについて考えてみます。
国|州-州|郡-教区|市-町|人口|PerCapitaIncome| WalMarts
したがって、私の見解は次のようになります。
Country Province-State County-Parish City-Town Population PerCapitaIncome Walmarts
+ USA 250000000 42000 2354
+ Alabama 9000000 23000 153
+ Barbour 15324 19032 1
Eufaula 6520 23000 1
+ Tennessee 14000000 29000 299
+ Hamilton 70000 41000 4
East Ridge 23000 32000 2
次に、QSqlTableModelで動作するために必要です。以前にモデルが表示されているのを見たことがありますが、上記のように階層によって行を作成する方法はありません。それが私の2番目の変更になります。
3番目の理由は、太字のヘッダーは、次の方法で並べ替えをオンにしている場合のオプションにすぎないことです。
view->setSortingEnabled(true);
並べ替えがオンの場合、太字のヘッダーは上の行でのみ機能し、下の行ではオフになります。そのバグを修正したいと思います。
QTreeView :: drawRow仮想メソッドは、最初のチャレンジ(そしておそらく3番目)を達成するためにオーバーライドする必要があるすべてのように見えます。QSqlTableModelを扱う2番目の課題は、よくわかりません。
とにかく、QTreeViewメソッドを呼び出すだけの汎用ctorとdtorを使用して、QTreeViewから継承する単純なクラスを作成しました。しかし、drawRowに関しては、次の問題が発生しました。QTreeView::drawRow関数は次のように始まります。
QTreeView::drawRow(
QPainter *painter,
const QStyleOptionViewItem &option,
const QModelIndex &index) const {
Q_D(const QTreeView);
QStyleOptionViewItemV4 opt = option;
const QPoint offset = d->scrollDelayOffset;
const int y = option.rect.y() + offset.y();
const QModelIndex parent = index.parent();
const QHeaderView *header = d->header;
const QModelIndex current = currentIndex();
const QModelIndex hover = d->hover;
const bool reverse = isRightToLeft();
const QStyle::State state = opt.state;
const bool spanning = d->spanning;
const int left = (spanning ? header->visualIndex(0) : d->leftAndRight.first);
const int right = (spanning ? header->visualIndex(0) : d->leftAndRight.second);
...
この関数は、Q_D(const QTreeView)を正常に実行し、「d」を返すことに依存しています。これは、レイアウトと関数の残りの部分に関連する重要な情報を含むQTreeViewPrivateクラスのインスタンスです。CustomTreeViewクラスを継承しているため、CustomTreeView :: drawRow()でQ_D(const QTreeView)を実行する場合は、最初にCustomTreeViewPrivateを定義してインスタンス化する必要があります。
このプライベートクラスを作成することは、継承して重要な変更を加えるために本当に必要ですか?私ができるのはいくつかの機能的なプロセスだけで、QTreeView :: drawRowを呼び出して実際の描画を行う場合、ここで継承することの利点は何ですか?
描き方を変えたい。