13

でカスタム ウィジェットのレンダリングを実装するのに問題がありQListViewます。現在、に基づいてQListView呼び出されたカスタム モデルを表示しています。PlayQueueQAbstractListModel

これは単純なテキストでは問題なく機能しますが、各要素のカスタム ウィジェットを表示したいと考えています。したがって、次のようにメソッドQStyledItemDelegateを実装するためにa をサブクラス化しました。paint

void QueueableDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index ) const
{
    if (option.state & QStyle::State_Selected)
        painter->fillRect(option.rect, option.palette.highlight());
    QWidget *widget = new QPushButton("bonjour");
    widget->render(painter);
}

選択した背景は適切にレンダリングされますが、ウィジェットは表示されません。Qtの例のような簡単なQPainterコマンドで試してみましたが、これはうまくいきます:

void QueueableDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index ) const
{
    if (option.state & QStyle::State_Selected)
        painter->fillRect(option.rect, option.palette.highlight());
    if (option.state & QStyle::State_Selected)
        painter->setPen(option.palette.highlightedText().color());
    painter->setFont(QFont("Arial", 10));
    painter->drawText(option.rect, Qt::AlignCenter, "Custom drawing");
}

だから私は次のようないくつかの変更を試みました:

  • QStyledItemDelegateに変更QItemDelegate
  • レンダリングの追加painter->save()と周辺painter->restore()
  • ウィジェット ジオメトリを使用可能なサイズに設定する

しかし、私は少し立ち往生しています。インターネットでしばらく検索しましたが、私が望むことを実行する例が見つかりません。それらはすべて、ウィジェットの編集 (はるかに簡単です) またはカスタム描画コントロール (事前定義されたもの) について話します、進行状況バーなど)。しかし、ここでは、いくつかのレイアウト、ラベル、およびピックスマップを含む、作成したカスタム ウィジェットが本当に必要です。ご協力いただきありがとうございます!

Ubuntu 11.04 で GCC に Qt 4.7.3 を使用しています。

4

3 に答える 3

4

わかりました、私はついに自分がやりたいことをする方法を見つけました。これが私がしたことです:

  1. デリゲート クラスを削除する
  2. QListView::setIndexWidget()モデルのメソッドを呼び出しdata()てウィジェットを設定する
  3. チェックして設定するときに、ウィジェットがまだ存在しないことを確認しますQListView::indexWidget()
  4. ロールを処理しQt::SizeHintRoleてウィジェットのサイズのヒントを返す
  5. Qt::DisplayRoleロールの空白の QVariant を返します

このようにして、カスタム ウィジェットを QListView に表示し、適切に遅延ロードします (モデル/ビュー パターンを使用したのはそのためです)。しかし、表示されていないときにそれらをアンロードする方法がわかりません。それは別の問題です。

于 2011-07-01T13:14:59.790 に答える
0

これがあなたのための例です。QStylePainter を使用する必要があるようですが、実際のボタンのようには機能しないことがわかっている限り、これは単なる描画用です。

于 2011-06-23T11:01:25.813 に答える