2011-07-11 14 views
0

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を呼び出して実際の描画を行うのですか?

どのように図面を変更したいですか?

答えて

1

私はできるだけ多くの質問をカバーしていきます。あなたの問題の全体を通して大きなことは、あなたが成し遂げようとしていることの大部分が、ビューではなくモデルを通して行われるべきであるということです(特定のエントリを太字で表示するなど)。このため、自分のモデルを作る必要があります。 QSqlTableModelを継承し、必要に応じて変更することができます。あなたは大胆な特定のアイテムにしたい場合たとえば、データモデルでは、あなたが書いた最後の事はQ_Dについてでした

QVariant MyModel::data(const QModelIndex & index, int role) const 
{ 
    QVariant result = QSqlTableModel::data(index, role); 
    // add your own qualifications to the following if statement, checking the row 
    // and such 
    if(role == Qt::FontRole) { 
     QFont font = result.value<QFont>(); 
     font.setBold(true); 
     return font; 
    } 
    return result; 
} 

書くことができます。これは、Qtソースコードでのみ使用できます。独自のペイント関数を実装する場合は、このマクロを使用する必要はありません。

私はmodelsを非常に重く読んでいます。ドキュメントにはたくさんのものが必要な場合があります。

+0

ええ、SqlModel型のいずれかから継承したカスタムモデルクラスも必要と考えていました。数日前に "select country"、 "、" "、" "、sum(Population)、sum(PerCapita)、sum(Walmarts)などの"階層 "レベルごとにループとQSqlQueryModelを使用して、 " QList に結果を追加し、QStandardItemModelの行に追加します。私はそのループ内で "select"、 "Province-State"、 ""、 ""、sum(Population)、sum(PerCapita)、sum(Walmarts) "などのような別のクエリを実行します。次にQTreeViewそれにQStandardItemModelを添付しました。 – jetimms

+0

上記はうまくいきますが、ビューの変更をデータベーステーブルにプッシュバックする良い方法はありません。したがって、私はQSqlTableModelを使ってQViewTreeを継承して動作させることを検討していました(現在、QAbstractTableModel [link](http://doc.qt.nokia.com/latest/qabstracttablemodel)から継承したクラスで動作するようには設計されていません。 html#details)。私は元のセットアップでQSqlTableModelを使ってアップデートを行うことができると思っています。 – jetimms

関連する問題