0

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を呼び出して実際の描画を行う場合、ここで継承することの利点は何ですか?

描き方を変えたい。

4

1 に答える 1

1

私はあなたの質問をできるだけ多くカバーしようとします。すべての問題の大きな点は、達成しようとしているものの多くは、ビューではなくモデルを介して実行する必要があるということです (特定のエントリを太字で表示するなど)。このため、独自のモデルを作成する必要があります。QSqlTableModel を継承して、必要に応じて変更することができます。たとえば、特定の項目を太字にしたい場合、データ モデルで次のように記述できます。

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;
}

あなたが最後に書いたのは Q_D についてでした。これは、Qt ソース コードでのみ使用されます。独自のペイント機能を実装している場合は、このマクロを使用する必要はありません。

私はモデルを非常によく読みます。ドキュメントには多くのものが必要になる場合があります。

于 2011-07-11T03:53:33.583 に答える