我希望能够从其下拉菜单中选择多个QComboBox
项目(使用Shift或Alt +单击以从当前选择添加/提取)。
点击后,QComboBox会下拉一个下拉菜单。
但是当用户再次点击鼠标(从下拉菜单中选择一个项目)时
ComboBox默认情况下不会回滚(或自动折叠)。相反,它将保持打开状态,以便用户能够按住Shift并单击更多的Combobox项目来添加或从选择中提取它们。最后,当用户对选择感到满意时,按下Enter
键以“确认”选择。
这是一张Photoshoped图片,展示了我想要实现的“多选”QComboBox的概念:
下面的代码创建了几乎每个暴露事件的QComboBox。但我唯一看到“代理”的是onMousePressEvent()。当用户从下拉菜单中选择项目时,我无法找到跟踪方式....
一小时后,我了解到QComboBox
可以通过其.view().setSelectionMode(3)
设置为多选。
然后可以使用相同的.view()
来查询Combobox所选项目:
selectedIndexes=self.view().selectionModel().selectedIndexes()
(其中self
本身就是一个组合)
有一种方法可以使用selectionModel.select(idx, QtGui.QItemSelectionModel.Select)
但到目前为止我还没能做到.....
from PyQt4 import QtCore, QtGui
app = QtGui.QApplication([])
class Combo(QtGui.QComboBox):
def __init__(self, *args, **kwargs):
super(Combo, self).__init__()
self.addItems(['Item_1','Item_2','Item_3','Item_4','Item_5'])
self.view=self.view()
self.view.setSelectionMode(3)
self.activated.connect(self.clicked)
self.show()
def clicked(self, arg=None):
selectionModel=self.view.selectionModel()
selectedIndexes=selectionModel.selectedIndexes()
for idx in selectedIndexes:
selectionModel.select(idx, QtGui.QItemSelectionModel.Select)
print 'selecting idx: %s'%idx
self.showPopup()
tree=Combo()
sys.exit(app.exec_())
答案 0 :(得分:3)
其他方式,您可以使用类似图标来检查状态。比QtGui.QStandardItem
容易。方法QIcon QComboBox.itemIcon (self, int index)
和方法QComboBox.setItemIcon (self, int index, QIcon icon)
可在课程QtGui.QComboBox
中找到;
import sys
from PyQt4 import QtGui
class QCustomComboBox (QtGui.QComboBox):
CHECK_QICON = QtGui.QIcon.fromTheme('call-start')
UNCHECK_QICON = QtGui.QIcon.fromTheme('call-stop')
def __init__(self, *args, **kwargs):
super(QCustomComboBox, self).__init__(*args, **kwargs)
listsItem = ['Item 1', 'Item 2', 'Item 3', 'Item 4', 'Item 5']
for index in range(0, len(listsItem)):
self.addItem(listsItem[index])
self.setItemIcon(index, self.UNCHECK_QICON)
self.activated.connect(self.customActivated)
def hidePopup (self):
pass # Force only ESC button to exit.
def customActivated (self, index):
# self.blockSignals(True) # Force first index only
# self.setCurrentIndex(0)
# self.blockSignals(False)
stateQIcon = self.itemIcon(index)
newQIcon = {
self.CHECK_QICON.name() : self.UNCHECK_QICON,
self.UNCHECK_QICON.name() : self.CHECK_QICON,
} [stateQIcon.name()]
self.setItemIcon(index, newQIcon)
print self.export() # View last update data
def export (self):
listsExportItem = []
for index in range(0, self.count()):
stateQIcon = self.itemIcon(index)
state = {
self.CHECK_QICON.name() : True,
self.UNCHECK_QICON.name() : False,
} [stateQIcon.name()]
listsExportItem.append([str(self.itemText(index)), state])
return listsExportItem
myQApplication = QtGui.QApplication([])
myQCustomComboBox = QCustomComboBox()
myQCustomComboBox.show()
sys.exit(myQApplication.exec_())
答案 1 :(得分:1)
我最终使用文本颜色来区分点击的(也就是选定的)项目。
首先点击ComboBox打开其下拉菜单。 以下所有点击都是选择/取消选择(突出显示为红色)项目。击中逃生以关闭下拉。
from PyQt4 import QtCore, QtGui
app = QtGui.QApplication([])
class Combo(QtGui.QComboBox):
def __init__(self, *args, **kwargs):
super(Combo, self).__init__()
for each in ['Item_1','Item_2','Item_3','Item_4','Item_5']:
item=QtGui.QStandardItem(each)
self.model().appendRow(item)
item.setData('black')
self.activated.connect(self.clicked)
self.show()
def clicked(self, clickedNumber=None):
self.blockSignals(True)
self.setCurrentIndex(0)
self.showPopup()
self.view().clearSelection()
clickedItem=self.model().item(clickedNumber)
color=clickedItem.data().toString()
if color=='black': clickedItem.setData('red')
elif color=='red': clickedItem.setData('black')
clickedItem.setForeground(QtGui.QColor(clickedItem.data().toString()))
clickedIndex=self.model().indexFromItem(clickedItem)
self.view().selectionModel().select(clickedIndex, QtGui.QItemSelectionModel.Select)
self.setCurrentIndex(clickedNumber)
self.blockSignals(False)
tree=Combo()
sys.exit(app.exec_())