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:
- ich in der falschen Richtung Gitter verwenden?
- Darf ich keine Punkte um das Gitter herum verwenden, wenn ich es übergebe?
- Wie behebe ich dieses Problem, so dass die Kontrollkästchen alle eine einzelne Dateizeile im Raster heruntergehen?
- Ist meine
CreateCheckbox
Klasse oder meinemyChanges
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_())
Yup, Sie haben Recht. Gibt es einen Grund für mich, "self.grid = grid" anstelle von grid zu verwenden?addWidget ... usw.? –
Ja, wenn Sie das Rasterobjekt irgendwo außerhalb von 'CreateCheckbox .__ init__' referenzieren wollen. – shrewmouse