Qtを使用してプロジェクトを開始します。私は次のいくつかのことを行うビューを得るために2つのアプローチを試みています。この質問には、QTreeViewから継承するアプローチが含まれます。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
第2に、私はQSqlTableModelで動作する必要があります。前にモデルを見てきたのを見ましたが、上記と同様に階層ごとに行を作成する方法はありません。それは私の2番目の修正になるだろう。
並べ替えが経由でオンになっている場合は、太字のヘッダーが唯一の選択肢である第三の理由:ソートがオンになっていると、大胆なヘッダーが高いだけアップ行のために働くし、その後消灯し
view->setSortingEnabled(true);
下のものに。私はそのバグを修正したい。
QTreeView :: drawRow仮想メソッドは、最初のチャレンジ(おそらく3番目のチャレンジ)を達成するためにオーバーライドする必要があります。 QSqlTableModelを扱う2番目の課題は、私はあまり確信していません。
私はQTreeViewから継承した単純なクラスを、QTreeViewメソッドを呼び出す汎用のctorとdtorで構築しました。しかし、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(定数QTreeView)正常に実行され、「d」を返す、レイアウトとすることに関する重要な情報が含まれているQTreeViewPrivateクラスのインスタンスを持っているに依存しています関数の残りの部分。私は私のCustomTreeViewクラスを継承しているので、CustomTreeView :: drawRow()でQ_D(const QTreeView)を実行する場合は、まずCustomTreeViewPrivateを定義してインスタンス化する必要があります。
このプライベートクラスを作成することは、継承して大幅に変更する必要がありますか?ここで継承する利点は、私ができることがいくつかありますが、QTreeView :: drawRowを呼び出して実際の描画を行うのですか?
どのように図面を変更したいですか?
ええ、SqlModel型のいずれかから継承したカスタムモデルクラスも必要と考えていました。数日前に "select country"、 "、" "、" "、sum(Population)、sum(PerCapita)、sum(Walmarts)などの"階層 "レベルごとにループとQSqlQueryModelを使用して、 " QListに結果を追加し、QStandardItemModelの行に追加します。私はそのループ内で "select"、 "Province-State"、 ""、 ""、sum(Population)、sum(PerCapita)、sum(Walmarts) "などのような別のクエリを実行します。次にQTreeViewそれにQStandardItemModelを添付しました。 –
jetimms
上記はうまくいきますが、ビューの変更をデータベーステーブルにプッシュバックする良い方法はありません。したがって、私はQSqlTableModelを使ってQViewTreeを継承して動作させることを検討していました(現在、QAbstractTableModel [link](http://doc.qt.nokia.com/latest/qabstracttablemodel)から継承したクラスで動作するようには設計されていません。 html#details)。私は元のセットアップでQSqlTableModelを使ってアップデートを行うことができると思っています。 – jetimms