2017-09-27 16 views
0

J'ai besoin que mes objets combobox soient vérifiables par l'utilisateur afin qu'ils puissent sélectionner plusieurs éléments. J'ai vu une solution sur stackoverflow. Je l'ai appliqué à mon code. Il a fait quelque chose, mais la case à cocher n'est pas encore visible et je ne suis pas encore en mesure de sélectionner un élément.CheckBox non visible à l'intérieur de ComboBox

Mon code est le suivant

from PySide.QtGui import * 
from PySide.QtCore import * 

udims = [here goes some items] 
cmb = QComboBox() 
model = QStandardItemModel(len(udims), 1) 
for i, udim in enumerate(udims): 
    item = QStandardItem(udim) 
    item.setFlags(Qt.ItemIsUserCheckable | Qt.ItemIsEnabled) 
    item.setData(Qt.Checked | Qt.CheckStateRole) 
    model.setItem(i, 0, item) 

cmb.setModel(model) 
+0

Cet exemple de code n'est pas un [MCVE] (http://stackoverflow.com/help/mcve). C'est ennuyeux car il est assez facile (en particulier en Python) d'en faire un: S'il vous plaît, corrigez l'affectation de 'udims' (par exemple' udims = ["ici", "va", "certains", "items"] '); fix 'model = QStandardItemModel (len (items), 1)' (par exemple 'model = QStandardItemModel (len (udims), 1)'); correction 'item = QStandarItem (udim)' (faute de frappe); ajoutez une instance de 'QApplication()'. J'ai fait tout cela (localement) dans PyQt5 et l'ai fait fonctionner. Btw. Je n'ai pas vu les cases à cocher dans mon "port" PyQt5 aussi. – Scheff

+0

Le comportement que vous décrivez (pas de cases à cocher, pas de sélection en vol stationnaire) J'ai vu de mon côté aussi (cygwin, python3, PyQt5). Jetez un oeil à [SO: ComboBox de CheckBoxes?] (Https://stackoverflow.com/a/20118475/7478597). Peut-être, vous devez utiliser l'astuce déléguée d'élément pour les rendre visibles. Btw. Je crois qu'il y a une autre faute de frappe dans 'item.setData (Qt.Checked | Qt.CheckStateRole)': ne devrait-il pas être 'item.setData (Qt.Checked, Qt.CheckStateRole)' (ie ** ',' ** au lieu de ** '|' **)? – Scheff

+0

ItemDelegate trick résolu mon problème. – Vicspidy

Répondre

1

J'ai pu obtenir ce travail en créant une sous-classe de QItemDelegate pour la case à cocher, puis brancher que dans le délégué de l'élément pour le combobox.

from PySide.QtCore import * 
from PySide.QtGui import * 

class CheckBoxDelegate(QItemDelegate): 
    def __init__(self, parent=None): 
     super(CheckBoxDelegate, self).__init__(parent) 

    def createEditor(parent, op, idx): 
     self.editor = QCheckBox(parent) 


udims = ['1001', '1002', '1003', '1004'] 
cmb = QComboBox() 
delegate = CheckBoxDelegate() 
cmb.setItemDelegate(delegate) 
model = QStandardItemModel(len(udims), 1) 
for i, udim in enumerate(udims): 
    item = QStandardItem(udim) 
    item.setFlags(Qt.ItemIsUserCheckable | Qt.ItemIsEnabled) 
    item.setData(Qt.Checked | Qt.CheckStateRole) 
    model.setItem(i, 0, item) 

cmb.setModel(model)