Python 移除QCombobox以显示窗口面板中的所有数据,以便用户一次选择多个值
我使用了下面的代码,它的作用是在组合框中显示一个值列表,但我遇到的困难是每次选中值时,下拉列表都会关闭 是否有可能在主窗口中显示所有菜单,而不是下拉菜单,作为所有复选框的列表,以便一次单击多个值 下面是代码片段Python 移除QCombobox以显示窗口面板中的所有数据,以便用户一次选择多个值,python,pyqt,pyqt5,qcombobox,Python,Pyqt,Pyqt5,Qcombobox,我使用了下面的代码,它的作用是在组合框中显示一个值列表,但我遇到的困难是每次选中值时,下拉列表都会关闭 是否有可能在主窗口中显示所有菜单,而不是下拉菜单,作为所有复选框的列表,以便一次单击多个值 下面是代码片段 from PyQt5 import QtCore, QtGui, QtWidgets import sys class CheckableComboBox(QtWidgets.QComboBox): def __init__(self, parent = None):
from PyQt5 import QtCore, QtGui, QtWidgets
import sys
class CheckableComboBox(QtWidgets.QComboBox):
def __init__(self, parent = None):
super(CheckableComboBox, self).__init__(parent)
self.setView(QtWidgets.QListView(self))
self.view().pressed.connect(self.handleItemPressed)
self.setModel(QtGui.QStandardItemModel(self))
def handleItemPressed(self, index):
item = self.model().itemFromIndex(index)
if item.checkState() == QtCore.Qt.Checked:
item.setCheckState(QtCore.Qt.Unchecked)
else:
item.setCheckState(QtCore.Qt.Checked)
def checkedItems(self):
checkedItems = []
for index in range(self.count()):
item = self.model().item(index)
if item.checkState() == QtCore.Qt.Checked:
checkedItems.append(item)
return checkedItems
class Ui_dialogCreateBatch(object):
def setupUi(self, dialogCreateBatch):
dialogCreateBatch.resize(400, 338)
dialogCreateBatch.setMouseTracking(True)
self.gridLayoutWidget = QtWidgets.QWidget(dialogCreateBatch)
self.gridLayoutWidget.setGeometry(QtCore.QRect(10, 10, 360, 115))
self.gridLayoutWidget.setObjectName("gridLayoutWidget")
self.gridLayout = QtWidgets.QGridLayout(self.gridLayoutWidget)
self.gridLayout.setContentsMargins(0, 0, 0, 0)
self.gridLayout.setObjectName("gridLayout")
self.cboItemList = CheckableComboBox(self.gridLayoutWidget)
self.cboItemList.setObjectName("cboItemList")
self.gridLayout.addWidget(self.cboItemList, 0, 0, 1, 1)
data = ('item1', 'item2', 'item3')
for index, element in enumerate(data):
self.cboItemList.addItem(element)
item = self.cboItemList.model().item(index, 0)
item.setCheckState(QtCore.Qt.Unchecked)
self.buttonBox = QtWidgets.QDialogButtonBox(dialogCreateBatch)
self.buttonBox.setGeometry(QtCore.QRect(100, 300, 156, 23))
self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Ok)
self.buttonBox.setObjectName("buttonBox")
self.retranslateUi(dialogCreateBatch)
QtCore.QMetaObject.connectSlotsByName(dialogCreateBatch)
def retranslateUi(self, dialogCreateBatch):
_translate = QtCore.QCoreApplication.translate
dialogCreateBatch.setWindowTitle(_translate("dialogCreateBatch", "Create Item Batch"))
class DialogCreateBatch(QtWidgets.QDialog, Ui_dialogCreateBatch):
def __init__(self, parent=None):
QtWidgets.QDialog.__init__(self, parent)
self.setupUi(self)
self.buttonBox.accepted.connect(self.on_accepted)
self.buttonBox.rejected.connect(self.reject)
def on_accepted(self):
selectedItems = self.cboItemList.checkedItems()
print(selectedItems)
self.accept()
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
w = DialogCreateBatch()
w.show()
sys.exit(app.exec_())
以下代码实现了一个QDialog,该对话框显示了一个QListView,该模型具有基于QStandardItemModel的可检查项: 导入系统 从PyQt5导入QtCore、QtGui、QtWidgets 类对话框CreateBatch(QtWidgets.QDialog): def uuu init uuu(self,parent=None): 超级(DialogCreateBatch,self)。\uuuu init\uuuuuu(父级) self.model=QtGui.QStandardItemModel(self) self.view=qtwidts.QListView() self.view.setModel(self.model) self.button_box=qtwidts.QDialogButtonBox() 自按钮盒设置方向(QtCore.Qt.水平) self.button_box.sets标准按钮( qtwidts.QDialogButtonBox.Cancel | qtwidts.QDialogButtonBox.Ok ) self.button\u box.accepted.connect(self.accept) self.button_box.拒绝.连接(self.reject) lay=qtwidts.QVBoxLayout(self) lay.addWidget(self.view) lay.addWidget(self.button\u框) @财产 def项目(自身): 项目=[] 对于范围内的i(self.model.rowCount()): it=self.model.item(i) items.append(it.text()) 退货项目 @项目设置器 def项目(自身、项目): self.model.clear() 对于项目中的项目: it=QtGui.QStandardItem(项目) it.setCheckable(True) self.model.appendRow(it) @财产 def检查项目(自身): 选中的项目=[] 对于范围内的i(self.model.rowCount()): it=self.model.item(i) 如果it.data(QtCore.Qt.CheckStateRole)=QtCore.Qt.Checked: 选中\u items.append(it.text()) 返回选中的项目 如果名称=“\uuuuu main\uuuuuuuu”: app=qtwidts.QApplication(sys.argv) w=DialogCreateBatch() w、 setWindowTitle(“堆栈溢出”) w、 项目=(“项目1”、“项目2”、“项目3”) 如果w.exec_uz()==qtwidts.QDialog.Accepted: 打印(带选中项)
我理解这个问题,但我不正确理解您想要什么。据我所知,您不再想使用QComboBox,而是想使用QListView或类似工具,我说的对吗?是的,因为在qcombobox中,它会给我一个下拉列表,每次我选择复选框时,复选框都会关闭,因此我想要一个qlistview,其中所有值都会同时显示,用户可以选择他想要的值并保存它。我可以将窗口标题的名称更改为其他名称吗?如果是,您可以帮助我吗