35

PyQt アプリケーションを作成していますが、カスタム リスト ビューの作成に問題があります。リストに任意のウィジェット (特に 1 つのカスタム ウィジェット) を含めたいと思います。これについてどうすればいいですか?

別の方法は、スクロールバーにラップされたテーブルまたはグリッド ビューを作成することです。ただし、組み込みハンドルのネスト (ツリー ビュー) サポートと同様に、モデル/ビュー アプローチを利用できるようにしたいと考えています。

明確にするために、カスタム ウィジェットはインタラクティブ (ボタンを含む) であるため、ソリューションにはウィジェットをペイントする以上のことが必要です。

4

5 に答える 5

16

私があなたの質問を正しく理解していれば、次のようなものが必要です。

ここに画像の説明を入力

各行にはウィジェットのカスタム セットが含まれています。

これを実現するには、2 つの手順を実行します。

カスタム ウィジェットを使用して行を実装する

まず、リスト行ごとに必要なすべてのウィジェットを含むカスタム ウィジェットを実装します。

ここでは、水平レイアウトで、1 行に 1 つのラベルと 2 つのボタンを使用しています。

class MyCustomWidget(QWidget):
    def __init__(self, name, parent=None):
        super(MyCustomWidget, self).__init__(parent)

        self.row = QHBoxLayout()

        self.row.addWidget(QLabel(name))
        self.row.addWidget(QPushButton("view"))
        self.row.addWidget(QPushButton("select"))

        self.setLayout(self.row)

リストに行を追加する

複数の行のインスタンス化は、ウィジェット アイテムを作成するだけの問題であり、カスタム ウィジェットをアイテムの行に関連付けます。

# Create the list
mylist = QListWidget()

# Add to list a new item (item is simply an entry in your list)
item = QListWidgetItem(mylist)
mylist.addItem(item)

# Instanciate a custom widget 
row = MyCustomWidget()
item.setSizeHint(row.minimumSizeHint())

# Associate the custom widget to the list entry
mylist.setItemWidget(item, row)
于 2018-03-14T08:34:47.883 に答える
5

@Idanの答えはうまくいきますが、私が思いついたより簡単な例を投稿します。このアイテム デリゲートは、アイテムごとに黒い四角形を描画するだけです。

class ItemDelegate : public QItemDelegate
{
public:
    explicit ItemDelegate(QObject *parent = 0) : QItemDelegate(parent) {}
    void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
    {
        painter->fillRect(option.rect.adjusted(1, 1, -1, -1), Qt::SolidPattern);
    }
};

次に、リスト ウィジェットに設定する必要があります。

ui->listWidget->setItemDelegate(new ItemDelegate(ui->listWidget));
于 2014-03-12T10:39:34.460 に答える
2

アシストは次のように述べています。

void QTableWidget::setCellWidget (int row, int column, QWidget * widget)  

指定された行と列のセルに表示される指定されたウィジェットを設定し、ウィジェットの所有権をテーブルに渡します。セル ウィジェット A をセル ウィジェット B に置き換えると、セル ウィジェット A は削除されます。

そして、ほとんどの QAbstractItemView の子孫には、このメソッドに類似したものがあります。

EditTrigger を押したときにのみビューにエディター ウィジェットを表示したい場合にのみ、Q***Delegate をサブクラス化する必要があります。

私が正しければ、常にアイテム ビューにコントロールを表示し、編集モードに入る必要なくコントロールをヒットし、デリゲートがエディターを作成してその状態を設定するまで待つ必要があるため、特定のデリゲートを作成する必要はありません。ビューのアイテムにウィジェットを設定します。

于 2010-03-19T10:48:58.180 に答える
1

listWidget にカスタム項目を追加する別の方法。この目的のために、新しいクラスを追加する必要があります。好きなように名前を付けて、「myList」と付けます。プロジェクトに新しいアイテムを追加する方法を知っていることを願っています。:)

次に、この新しいフレームにコントロールを好きなだけ追加します。QLabels、QlineEdit など

次に、メインクラスで listWidget 名リストを追加するか、必要に応じて次のコードを記述する必要があります

MyList *myList = new MyList();
QListWidgetItem *item = new QListWidgetItem();
ui->list->insertItem(ui->list->size().height(),item);
item->setSizeHint(QSize(50,30));
ui->list->setItemWidget(item,myList);

後者では、シグナル/スロットを使用してアイテムのプロパティを変更することもできます..

その助けを願っています..!

于 2013-04-01T12:11:09.347 に答える