2017-06-14 2 views
4

Ich versuche, eine Liste von Kontrollkästchen in PySide zu erstellen. Diese Kontrollkästchen befinden sich innerhalb eines Rasters innerhalb eines Rahmens.PySide: Erstellen einer Liste von Kontrollkästchen

Weil ich über hundert Checkboxen brauche, dachte ich, es wäre am besten, diese Checkboxen in einer Liste zu speichern. Innerhalb class Ui_MainWindow(object): gibt es def setupUi(self, MainWindow): und innerhalb dieser rufe ich meine Methode myChanges mit self.myChanges(MainWindow, self.customCheckBoxes, self.frame, self.gridLayout). Rechts oben, dass ich erstellen eine leere Liste, um zu versuchen, die Objekte in speichern mit self.customCheckBoxes = []

Außerhalb der Ui_MainWindow Klasse, ich habe eine eigene Klasse CreateCheckbox benannt, die eine Checkbox unter einem Rahmen zu machen versucht, setzen Sie den Namen des Objekts, fügen es zu einer Stelle im Raster und setze seinen Text. Von dem, was ich sagen kann, kann es die ersten zwei völlig in Ordnung, das Problem mit der Linie self.grid.addWidget(self.checkBox, gridPlace, 1, 1, 1). Genauer gesagt, hat es ein Problem mit grid und diesem Fehler führt: AttributeError: 'CreateCheckbox' object has no attribute 'grid'

Meine Fragen sind:

  1. ich in der falschen Richtung Gitter verwenden?
  2. Darf ich keine Punkte um das Gitter herum verwenden, wenn ich es übergebe?
  3. Wie behebe ich dieses Problem, so dass die Kontrollkästchen alle eine einzelne Dateizeile im Raster heruntergehen?
  4. Ist meine CreateCheckbox Klasse oder meine myChanges Methode an der falschen Stelle/wo würde ich sie stattdessen setzen?

Edit: Ich denke, ich habe gefunden, was ich falsch gemacht habe. in class CreateCheckbox, sollte es keine self. in self.grid.addWidget(self.checkBox, gridPlace, 1, 1, 1) sein, weil das Netz nicht eine Instanz der CreateCheckbox Klasse ist

Edit 2: Nur für den Fall, dass jemand will den Text zum Laufen bringen, in Anführungszeichen MainWindow in setzen self.checkBox.setText(QtGui.QApplication.translate(MainWindow, text, None, QtGui.QApplication.UnicodeUTF8)) so haben Sie self.checkBox.setText(QtGui.QApplication.translate("MainWindow", text, None, QtGui.QApplication.UnicodeUTF8))

Hier ist der vollständige Code:

from PySide import QtCore, QtGui 


class Ui_MainWindow(object): 
    def myChanges(self, MainWindow, checkboxes, frame, grid): 
     for j in range(100): 
      checkboxes.append(CreateCheckbox(MainWindow, frame, grid, "Test", j)) 

    def setupUi(self, MainWindow): 
     MainWindow.setObjectName("MainWindow") 
     MainWindow.resize(800, 600) 
     self.centralwidget = QtGui.QWidget(MainWindow) 
     self.centralwidget.setObjectName("centralwidget") 
     self.frame = QtGui.QFrame(self.centralwidget) 
     self.frame.setGeometry(QtCore.QRect(180, 90, 371, 311)) 
     self.frame.setFrameShape(QtGui.QFrame.StyledPanel) 
     self.frame.setFrameShadow(QtGui.QFrame.Raised) 
     self.frame.setObjectName("frame") 
     self.gridLayout_2 = QtGui.QGridLayout(self.frame) 
     self.gridLayout_2.setObjectName("gridLayout_2") 
     self.gridLayout = QtGui.QGridLayout() 
     self.gridLayout.setObjectName("gridLayout") 
     self.gridLayout_2.addLayout(self.gridLayout, 0, 0, 1, 1) 
     MainWindow.setCentralWidget(self.centralwidget) 
     self.menubar = QtGui.QMenuBar(MainWindow) 
     self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21)) 
     self.menubar.setObjectName("menubar") 
     MainWindow.setMenuBar(self.menubar) 
     self.statusbar = QtGui.QStatusBar(MainWindow) 
     self.statusbar.setObjectName("statusbar") 
     MainWindow.setStatusBar(self.statusbar) 

     self.retranslateUi(MainWindow) 
     QtCore.QMetaObject.connectSlotsByName(MainWindow) 

     # Create list holding checkbox objects 
     self.customCheckBoxes = [] 
     self.myChanges(MainWindow, self.customCheckBoxes, self.frame, self.gridLayout) 

    def retranslateUi(self, MainWindow): 
     MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8)) 


class CreateCheckbox(object): 
    def __init__(self, MainWindow, frame, grid, text, gridPlace): 
     # 1. Create under appropriate frame 
     self.checkBox = QtGui.QCheckBox(frame) 
     # 2. Set its name 
     # Although the designer does this, pretty sure this is unneccesary 
     self.checkBox.setObjectName(chr(gridPlace)) 
     # 3. Add it to the appropriate spot in the grid 
     self.grid.addWidget(self.checkBox, gridPlace, 1, 1, 1) 
     # 4. Set text that user sees 
     # For now, I'm just sending 'Test' 
     self.checkBox.setText(QtGui.QApplication.translate(MainWindow, text, None, QtGui.QApplication.UnicodeUTF8)) 

if __name__ == "__main__": 
    import sys 
    app = QtGui.QApplication(sys.argv) 
    MainWindow = QtGui.QMainWindow() 
    ui = Ui_MainWindow() 
    ui.setupUi(MainWindow) 
    MainWindow.show() 
    sys.exit(app.exec_()) 

Antwort

1

der Fehler sagt Ihnen, dass CreateCheckbox kein Mitglied namens Gitter hat.

Ich denke, dass Sie die grid Variable verweisen gemeint, die Sie in die Klasse Konstruktor übergeben (__init__)

class CreateCheckbox(object): 
    def __init__(self, MainWindow, frame, grid, text, gridPlace): 
     ################# 
     self.grid = grid 
     ################# 

     # 1. Create under appropriate frame 
     self.checkBox = QtGui.QCheckBox(frame) 
     # 2. Set its name 
     # Although the designer does this, pretty sure this is unneccesary 
     self.checkBox.setObjectName(chr(gridPlace)) 
     # 3. Add it to the appropriate spot in the grid 
     self.grid.addWidget(self.checkBox, gridPlace, 1, 1, 1) 
     # 4. Set text that user sees 
     # For now, I'm just sending 'Test' 
     self.checkBox.setText(QtGui.QApplication.translate(MainWindow, text, None, QtGui.QApplication.UnicodeUTF8)) 
+1

Yup, Sie haben Recht. Gibt es einen Grund für mich, "self.grid = grid" anstelle von grid zu verwenden?addWidget ... usw.? –

+0

Ja, wenn Sie das Rasterobjekt irgendwo außerhalb von 'CreateCheckbox .__ init__' referenzieren wollen. – shrewmouse

1

Dieser Code führt mich zu glauben, dass Sie CreateCheckBox erwarten ein QCheckBox Objekt zurückgeben, aber das ist nicht das, was du machst.

CreateCheckbox sollte entweder eine Funktion sein, die ein QCheckBox-Objekt zurückgibt, oder eine Klasse, die von QCheckBox abgeleitet ist.

def CreateCheckbox(MainWindow, frame, grid, text, gridPlace): 
     # 1. Create under appropriate frame 
     checkBox = QtGui.QCheckBox(frame) 
     # 2. Set its name 
     # Although the designer does this, pretty sure this is unneccesary 
     checkBox.setObjectName(chr(gridPlace)) 
     # 3. Add it to the appropriate spot in the grid 
     grid.addWidget(checkBox, gridPlace, 1, 1, 1) 
     # 4. Set text that user sees 
     # For now, I'm just sending 'Test' 
     checkBox.setText(QtGui.QApplication.translate(MainWindow, text, None, QtGui.QApplication.UnicodeUTF8)) 
     return checkBox 

Oder können Sie CreateCheckbox eine Methode machen:

class Ui_MainWindow(object): 
    def CreateCheckbox(self, MainWindow, frame, grid, text, gridPlace): 
     # 1. Create under appropriate frame 
     checkBox = QtGui.QCheckBox(frame) 
     # 2. Set its name 
     # Although the designer does this, pretty sure this is unneccesary 
     checkBox.setObjectName(chr(gridPlace)) 
     # 3. Add it to the appropriate spot in the grid 
     grid.addWidget(checkBox, gridPlace, 1, 1, 1) 
     # 4. Set text that user sees 
     # For now, I'm just sending 'Test' 
     checkBox.setText(QtGui.QApplication.translate(MainWindow, text, None, QtGui.QApplication.UnicodeUTF8)) 
     return checkBox 
+2

Sie haben recht, ich habe das Kontrollkästchen komplett vergessen –

Verwandte Themen