python - guia - PyQt: ¿Cómo establecer los elementos de Combobox es seleccionable?
qgis manual (3)
Es muy fácil. Simplemente configure el elemento Comprobable usando la función flags () en el modelo asociado con comboBox.
def flags(self, index):
return Qt.ItemIsUserCheckable | Qt.ItemIsSelectable | Qt.ItemIsEnabled
ACTUALIZAR
Este puede no ser el mejor método, pero debería ordenar su problema. Aquí hay algo que puede desear ver, SI tiene restricción de espacio y no puede mostrar la lista completa, simplemente cambie el tamaño hasta que se vea como un ComboBox.
Para mantener el número de widgets de GUI al mínimo, necesito encontrar una manera de darle al usuario una opción de elementos de menú desplegables que podrían usarse para filtrar los elementos mostrados en un widget de lista. Supongamos que el listwidget enumera 5 categorías diferentes de elementos: "Cat A", "Cat B", "Cat C", "Cat D", "Cat E". Podría implementar la radio o casillas de verificación para cada categoría de artículo. Pero luego 5 botones de radio o casillas de verificación tomarían mucho espacio en la GUI. Un cuadro combinado con los elementos seleccionables parece ser una buena opción. ¿Algunas ideas?
from PyQt4 import QtGui, QtCore
import sys, os
class CheckableComboBox(QtGui.QComboBox):
def __init__(self):
super(CheckableComboBox, self).__init__()
def flags(self, index):
return Qt.ItemIsUserCheckable | Qt.ItemIsSelectable | Qt.ItemIsEnabled
class Dialog_01(QtGui.QMainWindow):
def __init__(self):
super(QtGui.QMainWindow,self).__init__()
myQWidget = QtGui.QWidget()
myBoxLayout = QtGui.QVBoxLayout()
myQWidget.setLayout(myBoxLayout)
self.setCentralWidget(myQWidget)
self.ComboBox = CheckableComboBox()
for i in range(3):
self.ComboBox.addItem("Combobox Item " + str(i))
myBoxLayout.addWidget(self.ComboBox)
if __name__ == ''__main__'':
app = QtGui.QApplication(sys.argv)
dialog_1 = Dialog_01()
dialog_1.show()
dialog_1.resize(480,320)
sys.exit(app.exec_())
(No respondí a la pregunta, por lo tanto usé la mayor parte del código de aquí)
Agregué una función y cambié el nombre a RadioComboBox si alguien más quiere tener una clase para RadioComboBox.
from PyQt4 import QtCore
from PyQt4.QtGui import QComboBox, QStandardItemModel
class RadioComboBox(QComboBox):
def __init__(self):
super(RadioComboBox, self).__init__()
self.view().pressed.connect(self.handle_item_pressed)
self.setModel(QStandardItemModel(self))
def handle_item_pressed(self, index):
item = self.model().itemFromIndex(index)
target_row = item.index().row()
if item.checkState() != QtCore.Qt.Checked:
item.setCheckState(QtCore.Qt.Checked)
self.check_others(target_row)
def check_others(self, target_row):
for i in range(self.model().rowCount()):
if i == target_row:
continue
else:
item = self.model().item(i)
item.setCheckState(QtCore.Qt.Unchecked)
Esta idea de un combo multi-selección ha aparecido antes , pero no estoy seguro de que sea la mejor solución. En realidad, todo lo que se necesita es un botón de herramienta con un menú desplegable (similar a los botones de historial en un navegador web).
Aquí hay una actualización del ejemplo que ilustra ambas opciones:
from PyQt4 import QtGui, QtCore
import sys, os
class CheckableComboBox(QtGui.QComboBox):
def __init__(self):
super(CheckableComboBox, self).__init__()
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)
class Dialog_01(QtGui.QMainWindow):
def __init__(self):
super(QtGui.QMainWindow,self).__init__()
myQWidget = QtGui.QWidget()
myBoxLayout = QtGui.QVBoxLayout()
myQWidget.setLayout(myBoxLayout)
self.setCentralWidget(myQWidget)
self.ComboBox = CheckableComboBox()
for i in range(3):
self.ComboBox.addItem("Combobox Item " + str(i))
item = self.ComboBox.model().item(i, 0)
item.setCheckState(QtCore.Qt.Unchecked)
self.toolbutton = QtGui.QToolButton(self)
self.toolbutton.setText(''Select Categories '')
self.toolmenu = QtGui.QMenu(self)
for i in range(3):
action = self.toolmenu.addAction("Category " + str(i))
action.setCheckable(True)
self.toolbutton.setMenu(self.toolmenu)
self.toolbutton.setPopupMode(QtGui.QToolButton.InstantPopup)
myBoxLayout.addWidget(self.toolbutton)
myBoxLayout.addWidget(self.ComboBox)
if __name__ == ''__main__'':
app = QtGui.QApplication(sys.argv)
dialog_1 = Dialog_01()
dialog_1.show()
dialog_1.resize(480,320)
sys.exit(app.exec_())