0

QListWidget に QListWidgetItem のリストがあります (アイテムの数が膨大なため、Hor スクロール バーがあります)。各 QListWidgetItem には QPixmap がデータとして含まれています (ランダムな値に縮小されています)。私の要件は、強調表示する必要がある QPixmap をクリックしたときです (ブラシ幅 10 の丸みを帯びた四角形)。各 QListWidgetItem を QItemDelegate に委任しています。ここでいくつか質問があります。

  1. 対応するQListWidgetItemが選択されているときにQPixmapの丸みを帯びた四角形をペイントする方法は?

  2. 上記のペイント イベントは、QPixmap がクリックされたときに発生する必要があります (QListWidgetItem の他の部分では発生しません)。QPixmap はサイズが異なるため、QListWidgetItem の QPixmap の上部と下部は空になり、そこをクリックすると ItemDelegate もトリガーされます。この選択を取り除く方法は?

4

1 に答える 1

0

QListWidget を使ったことがないので、それが可能かどうかはわかりません。ただし、QListView とカスタム モデルとデリゲートを使用して行います。その要点は次のようになります。

私のカスタムQAbstractListModel内:

QVariant data(const QModelIndex &index, int role) const
{
    if(index.isValid())
    {
        switch(role)
        {
            case MyCustomRole:
                return QVariant(*pointerToMyQPixmap);
            break;
...

私のカスタムQStyledItemDelegate内:

void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{

...

    // Best make DAMN sure it's not null else we will crash and burn.
    QPixmap pix = index.data(myCustomRole).value<QPixmap>();
    painter->drawPixmap(1, 1, pix);

...

私の見解では、Qt のモデル/ビュー フレームワークはやや不自由ですが、フレームワークで提供される組み込みウィジェットの基本機能以外の機能が必要な場合は、理解するまで学習する必要があります。つまり、QListWidget でより多くの機能が必要な場合は、QListView を調べて、独自のモデルとビューを実装する必要があります。

http://qt-project.org/doc/qt-4.8/qlistview.html#details

于 2012-03-07T22:52:04.660 に答える