PySideのみならずPyQtでも同じです。
カスタマイズしたQListWidgetを作りたい
それにはQListWidgetの拡張は必要ありません。
単にリストアイテムを定義するだけでOKです。
ここでは次のカスタムQListWidgetを作ります。
▼ カスタムしたいリストアイテムの中身
- レイアウトは垂直並べ
- 上部にラベルを配置
- 下部にはボタンを配置
少し分かりにくい部分もあるので、
Python・PySideでの作り方をまとめました。
このページの目次
1.初めにリストアイテム用のQWidgetクラス作成
ここでは MyCustomWidget というクラス名
それがQListWidgetに追加するカスタムアイテムです。
▼ 実際にこのようなコードを定義した
1 2 3 4 5 6 7 8 9 10 |
class MyCustomWidget(QWidget): def __init__(self, name, parent=None): super(MyCustomWidget, self).__init__(parent) self.row = QVBoxLayout() self.row.addWidget(QLabel(name)) self.row.addWidget(QPushButton("i like it")) self.setLayout(self.row) |
当然ながらQWidgetを継承すること
あとは垂直レイアウトだからQVBoxLayoutを使っており、それにラベルとボタンを追加してるだけです。あとコンストラクタにはラベル用の名前を受け取ってます。
本当はQDeisgherからuiファイルを作り、コンストラクタ内で読み込みすると楽です。今回は単純なレイアウトなので直にQVBoxLayoutを生成しました。
ひとまずリストアイテムの定義は完了
2.QListWidgetにリストアイテムを動的に追加する
そしたらQListWidgetにアイテムを追加するだけ
データソース配列から動的に追加するのが王道です。
▼ 例 : QListWidgetへのリストアイテム追加
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
## QListWidget listWidget = QListWidget() ## リストアイテムのデータ配列 dataSources = [ {'name': 'Java'}, {'name': 'JavaScript'}, {'name': 'PHP'}, {'name': 'Python'}, {'name': 'Rust'} ] ## 各データごとにQListWidgetItem追加 for dataSrc in dataSources: ## まずQListWidgetItemインスタンス化 item = QListWidgetItem() ## それをQListWidgetに追加しておく listWidget.addItem(item) ## 先ほど作ったMyCustomWidgetインスタンス化 row = MyCustomWidget(dataSrc['name']) item.setSizeHint(row.minimumSizeHint()) # カスタムアイテムを追加 listWidget.setItemWidget(item, row) ## QListWidget自身をウィンドウなどに追加 window.addWidget(listWidget) |
大体このような流れ
カスタマイズしたリストアイテム(MyCustomWidget)を追加する時、 item.setSizeHint(row.minimumSizeHint()) とすることでリサイズが起きても収まるように調整してます。
あとはデータソース配列(dataSources)をループで回し、ひたすら必要な分だけリストアイテムを追加していってるだけです。
やってることはそれだけ
3.出来上がったカスタムQListWidgetの見た目
ウィンドウ全体に表示してみました。
▼ 出来上がったQListWidgetはこういう感じ
ここで作ったのは本当に見た目だけです。ボタンを押しても反応しないけど、clickedシグナルにスロット関数を動的追加していけば個別に処理ができます。
▼ ちなみにSIGNAL/SLOTについての記事
イベント処理とか見栄えとか…
そこらへんは各自工夫してください。
QListWidgetのカスタマイズ方法をまとめ
ここまでを箇条書きでまとめます。
以上、カスタムしたQListWidgetを作る方法でした。
上記手順で簡単にカスタマイズできます。