ComboBoxのエントリがCheckBoxであるのと同じように、CheckBoxを含むドロップダウンリストを実装する必要があります。しかし、QComboBoxはQCheckBoxをメンバーとして受け入れず、代替ソリューションを見つけることができませんでした。QtWikiでC++の実装を見つけましたが、Pythonに移植する方法がわかりません。
3 に答える
これが必要になったとき、より簡単な解決策を考え出しました (少なくとも QCombobox をサブクラス化する必要はありません)。それは私のために働いた。つまり、チェック可能なアクションを含むメニューを作成し、それをボタンに設定します。次に、メニューまたはアクションをスロットに接続します。
Qt のコード (まだ PyQt を使用していません。申し訳ありませんが、それを移植できることを願っています。私には簡単に思えます) は次のようなものでした。
QMenu *menu = new QMenu;
QAction *Act1 = new QAction("Action 1", menu);
Act1->setCheckable(true);
QAction *Act2 = new QAction("Action 2", menu);
Act2->setCheckable(true);
menu->addAction(Act1);
menu->addAction(Act2);
QPushButton *btn = new QPushButton("Btn");
btn->setMenu(menu);
お役に立てれば
アイテムはチェックボックスをサポートしているため、ユーザーがチェックできるようにアイテムをマークし、最初のcheckStateを設定してチェックボックスが表示されるようにするだけでよいため、コンボボックスアイテムモデルを使用します(有効な状態がある場合にのみ表示されます)。
item.setFlags(QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsEnabled)
item.setCheckState(QtCore.Qt.Unchecked) # causes checkBox to show
最小限のサブクラスの例を次に示します。
from PyQt5 import QtGui, QtCore, QtWidgets
import sys, os
# subclass
class CheckableComboBox(QtWidgets.QComboBox):
# once there is a checkState set, it is rendered
# here we assume default Unchecked
def addItem(self, item):
super(CheckableComboBox, self).addItem(item)
item = self.model().item(self.count()-1,0)
item.setFlags(QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsEnabled)
item.setCheckState(QtCore.Qt.Unchecked)
def itemChecked(self, index):
item = self.model().item(i,0)
return item.checkState() == QtCore.Qt.Checked
# the basic main()
app = QtWidgets.QApplication(sys.argv)
dialog = QtWidgets.QMainWindow()
mainWidget = QtWidgets.QWidget()
dialog.setCentralWidget(mainWidget)
ComboBox = CheckableComboBox(mainWidget)
for i in range(6):
ComboBox.addItem("Combobox Item " + str(i))
dialog.show()
sys.exit(app.exec_())
コンボボックス内にツリービュー(チェックボックス付き)を作成する方法 - PyQtで同様の質問に回答しましたが、とにかく、返信を完全にするために、ここに貼り付けます:
data メソッドと SetData メソッドで Qt.CheckStateRole をサポートし、flags メソッドで Qt.ItemIsUserCheckable フラグをサポートするモデルを作成する必要があります。
プロジェクトで使用している例をここに貼り付けます。これは、任意のモデルで使用する QSortFilterProxyModel 汎用実装ですが、モデル実装で同じアイデアを使用できます。明らかに、このサブクラスで直接使用していない内部構造を使用していますPyQt であり、内部実装 (self.booleanSet および self.readOnlySet) にアタッチされています。
def flags(self, index):
if not index.isValid():
return Qt.ItemIsEnabled
if index.column() in self.booleanSet:
return Qt.ItemIsUserCheckable | Qt.ItemIsSelectable | Qt.ItemIsEnabled
elif index.column() in self.readOnlySet:
return Qt.ItemIsSelectable | Qt.ItemIsEnabled
else:
return QSortFilterProxyModel.flags(self, index)
def data(self, index, role):
if not index.isValid():
return QVariant()
if index.column() in self.booleanSet and role in (Qt.CheckStateRole, Qt.DisplayRole):
if role == Qt.CheckStateRole:
value = QVariant(Qt.Checked) if index.data(Qt.EditRole).toBool() else QVariant(Qt.Unchecked)
return value
else: #if role == Qt.DisplayRole:
return QVariant()
else:
return QSortFilterProxyModel.data(self, index, role)
def setData(self, index, data, role):
if not index.isValid():
return False
if index.column() in self.booleanSet and role == Qt.CheckStateRole:
value = QVariant(True) if data.toInt()[0] == Qt.Checked else QVariant(False)
return QSortFilterProxyModel.setData(self, index, value, Qt.EditRole)
else:
return QSortFilterProxyModel.setData(self, index, data, role)