PySide/PyQt:如何创建自定义类?

PySide/PyQt:如何创建自定义类?

问题描述:

我试图创建复选框,框架和网格布局对象,并将它们存储在自己的列表中。PySide/PyQt:如何创建自定义类?

从Qt设计师的输出如下所示:enter image description here

从本质上讲,我想创建Checkbox1,然后创建一个框架和网格布局存储Checkbox2和Checkbox3。

我的方法是先创建一个空表来存储对象我创建: checkboxList = [] 然后调用追加它来创建合适的对象checkboxList.append(CreateCheckBox(self.frame_main, self.gridLayout_main, 0, 'Checkbox 1')(例如)

这将产生输出:enter image description here

我创建的框架不可见! 我猜这是你的几个可能的原因:

  1. 我创建的类错误
  2. 我存储我创建正确的对象(所以我即init不会返回任何东西米实际上并不存储任何东西?)
  3. 我没有加入我的对象在主框架适当所以他们没有显示出来

为什么我的类实现工作像Qt设计和代码我如何进行更改以获得类似的输出?

从Qt设计导入的代码如下所示:

from PySide import QtCore, QtGui 

class Ui_MainWindow(object): 
    def setupUi(self, MainWindow): 
     MainWindow.setObjectName("MainWindow") 
     MainWindow.resize(494, 210) 
     self.centralwidget = QtGui.QWidget(MainWindow) 
     self.centralwidget.setObjectName("centralwidget") 
     self.frame_main = QtGui.QFrame(self.centralwidget) 
     self.frame_main.setGeometry(QtCore.QRect(20, 10, 435, 141)) 
     self.frame_main.setFrameShape(QtGui.QFrame.StyledPanel) 
     self.frame_main.setFrameShadow(QtGui.QFrame.Raised) 
     self.frame_main.setObjectName("frame_main") 
     self.gridLayout_2 = QtGui.QGridLayout(self.frame_main) 
     self.gridLayout_2.setContentsMargins(0, 0, 0, 0) 
     self.gridLayout_2.setSpacing(0) 
     self.gridLayout_2.setObjectName("gridLayout_2") 
     self.gridLayout_main = QtGui.QGridLayout() 
     self.gridLayout_main.setSpacing(0) 
     self.gridLayout_main.setObjectName("gridLayout_main") 
     self.frame2 = QtGui.QFrame(self.frame_main) 
     self.frame2.setFrameShape(QtGui.QFrame.StyledPanel) 
     self.frame2.setFrameShadow(QtGui.QFrame.Raised) 
     self.frame2.setObjectName("frame2") 
     self.gridLayout_16 = QtGui.QGridLayout(self.frame2) 
     self.gridLayout_16.setContentsMargins(0, 0, 0, 0) 
     self.gridLayout_16.setObjectName("gridLayout_16") 
     self.gridLayout2 = QtGui.QGridLayout() 
     self.gridLayout2.setObjectName("gridLayout2") 
     spacerItem = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Minimum) 
     self.gridLayout2.addItem(spacerItem, 0, 0, 1, 1) 
     self.checkBox2 = QtGui.QCheckBox(self.frame2) 
     self.checkBox2.setObjectName("checkBox2") 
     self.gridLayout2.addWidget(self.checkBox2, 0, 1, 1, 1) 
     self.checkBox3 = QtGui.QCheckBox(self.frame2) 
     self.checkBox3.setObjectName("checkBox3") 
     self.gridLayout2.addWidget(self.checkBox3, 1, 1, 1, 1) 
     self.gridLayout_16.addLayout(self.gridLayout2, 0, 0, 1, 1) 
     self.gridLayout_main.addWidget(self.frame2, 1, 1, 1, 1) 
     self.checkBox1 = QtGui.QCheckBox(self.frame_main) 
     self.checkBox1.setObjectName("checkBox1") 
     self.gridLayout_main.addWidget(self.checkBox1, 0, 1, 1, 1) 
     spacerItem1 = QtGui.QSpacerItem(50, 20, QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Minimum) 
     self.gridLayout_main.addItem(spacerItem1, 0, 0, 1, 1) 
     self.gridLayout_2.addLayout(self.gridLayout_main, 0, 0, 1, 1) 
     MainWindow.setCentralWidget(self.centralwidget) 
     self.menubar = QtGui.QMenuBar(MainWindow) 
     self.menubar.setGeometry(QtCore.QRect(0, 0, 494, 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) 

    def retranslateUi(self, MainWindow): 
     MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8)) 
     self.checkBox2.setText(QtGui.QApplication.translate("MainWindow", "Checkbox2", None, QtGui.QApplication.UnicodeUTF8)) 
     self.checkBox3.setText(QtGui.QApplication.translate("MainWindow", "Checkbox3", None, QtGui.QApplication.UnicodeUTF8)) 
     self.checkBox1.setText(QtGui.QApplication.translate("MainWindow", "Checkbox1", 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_()) 

我与类的代码如下所示:

from PySide import QtCore, QtGui 


class CreateCheckBox(QtGui.QCheckBox): 
    def __init__(self, frame, grid, gridLoc, name, parent=None): 
     #QtGui.QCheckBox.__init__(self, parent=parent) Is this the same as the super below? 
     super(CreateCheckBox, self).__init__(parent) 
     self.checkbox = QtGui.QCheckBox(frame) 
     grid.addWidget(self.checkbox, gridLoc, 2, 1, 1) 
     self.checkbox.setText(name) 


class CreateFrame(QtGui.QFrame): 
    def __init__(self, parentFrame, parentGridLayout, gridLoc, parent=None): 
     #QtGui.QFrame.__init__(self, parent=parent) Is this the same as the super below? 
     super(CreateFrame, self).__init__(parent) 
     self.frame = QtGui.QFrame(parentFrame) 
     self.frame.setFrameShape(QtGui.QFrame.StyledPanel) 
     self.frame.setFrameShadow(QtGui.QFrame.Raised) 
     parentGridLayout.addWidget(self.frame, gridLoc, 2, 1, 1) 


class CreateGridLayout(QtGui.QGridLayout): 
    def __init__(self, parentFrame, parent=None): 
     super(CreateGridLayout, self).__init__(parent) 
     #QtGui.QGridLayout.__init__(self) # This line throws an error if I include parent=parent, why?.. 
     self.gridLayoutSecondary = QtGui.QGridLayout(parentFrame) 
     self.gridLayoutSecondary.setContentsMargins(0, 0, 0, 0) 
     self.gridLayoutPrimary = QtGui.QGridLayout() 
     spacerItem = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Minimum) 
     self.gridLayoutPrimary.addItem(spacerItem, 0, 0, 1, 1) 
     self.gridLayoutSecondary.addLayout(self.gridLayoutPrimary, 0, 0, 1, 1) 


class Ui_MainWindow(object): 
    def setupUi(self, MainWindow): 
     MainWindow.setObjectName("MainWindow") 
     MainWindow.resize(494, 210) 
     self.centralwidget = QtGui.QWidget(MainWindow) 
     self.centralwidget.setObjectName("centralwidget") 
     self.frame_main = QtGui.QFrame(self.centralwidget) 
     self.frame_main.setGeometry(QtCore.QRect(20, 10, 435, 141)) 
     self.frame_main.setFrameShape(QtGui.QFrame.StyledPanel) 
     self.frame_main.setFrameShadow(QtGui.QFrame.Raised) 
     self.frame_main.setObjectName("frame_main") 
     self.gridLayout_main = QtGui.QGridLayout() 
     self.gridLayout_main.setSpacing(0) 
     self.gridLayout_main.setObjectName("gridLayout_main") 
     spacerItem1 = QtGui.QSpacerItem(50, 20, QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Minimum) 
     self.gridLayout_main.addItem(spacerItem1, 0, 0, 1, 1) 
     MainWindow.setCentralWidget(self.centralwidget) 
     self.menubar = QtGui.QMenuBar(MainWindow) 
     self.menubar.setGeometry(QtCore.QRect(0, 0, 494, 21)) 
     self.menubar.setObjectName("menubar") 
     MainWindow.setMenuBar(self.menubar) 
     self.statusbar = QtGui.QStatusBar(MainWindow) 
     self.statusbar.setObjectName("statusbar") 
     MainWindow.setStatusBar(self.statusbar) 

     # List that contains new checkboxes 
     checkboxList = [] 
     # List that contains new frames 
     frameList = [] 
     # List than contains grid layouts for new frames 
     gridLayoutList = [] 

     # Create 'checkBox1' 
     checkboxList.append(CreateCheckBox(self.frame_main, self.gridLayout_main, 0, 'Checkbox 1')) 
     # Create 'frame2' 
     frameList.append(CreateFrame(self.frame_main, self.gridLayout_main, 1)) 
     # Create 'gridLayout2' 
     gridLayoutList.append(CreateGridLayout(frameList[0])) 
     # Create 'checkBox2' 
     checkboxList.append(CreateCheckBox(frameList[0], gridLayoutList[0], 0, 'Checkbox 2')) 
     # Create 'checkBox3' 
     checkboxList.append(CreateCheckBox(frameList[0], gridLayoutList[0], 1, 'Checkbox 3')) 

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

    def retranslateUi(self, MainWindow): 
     MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", 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_()) 
+0

你能解释一下我好,说你申请2倍的功能,应该是什么样的输出? – eyllanesc

+0

我相信你应该更正你的自定义类,当你声明一个类'CreateCheckBox(QtGui.QCheckBox)'时,这已经是一个复选框,不需要指定一个新的'self.checkbox = QtGui.QCheckBox'。 – PRMoureu

+1

我不明白你的问题。我基本上试图用类来重新创建从Qt Designer导入的原始设计。 –

萨尔瓦多problema SE soluciona maquetando correctamente恩aplicación,EN LA siguiente imagen画质SE muestra el maquetado de QMainWindow,la imagen muestra que QMainWindow varias secciones。

enter image description here

在你的情况,你应该设计centralwidget,

enter image description here

于是,答案可以实现,指出这是没有必要使用QGridLayout因为它是用来分配它作为一个矩阵。我创建了addCheckbox函数,它添加了小部件并将其存储在列表中。

from PyQt4 import QtGui, QtCore 


class MainWindow(QtGui.QMainWindow): 
    def __init__(self, parent=None): 
     QtGui.QMainWindow.__init__(self, parent=parent) 

     # add menubar 
     self.menubar = QtGui.QMenuBar(self) 
     self.menubar.setGeometry(QtCore.QRect(0, 0, 494, 21)) 
     self.setMenuBar(self.menubar) 
     # add statusbar 
     self.statusbar = QtGui.QStatusBar(self) 
     self.setStatusBar(self.statusbar) 

     # set central widget 
     self.centralwidget = QtGui.QWidget(self) 
     self.setCentralWidget(self.centralwidget) 

     lay = QtGui.QVBoxLayout(self.centralwidget) 
     self.checkBox = QtGui.QCheckBox("checkbox1", self) 
     lay.addWidget(self.checkBox) 

     self.frame = QtGui.QFrame(self) 
     lay.addWidget(self.frame) 

     self.layout_of_frame = QtGui.QVBoxLayout(self.frame) 

     self.checkBoxList = [] 
     self.addCheckbox("checkbox2") 
     self.addCheckbox("checkbox3") 
     self.addCheckbox("checkbox4") 
     self.addCheckbox("checkbox5") 

    def addCheckbox(self, text): 
     checkbox = QtGui.QCheckBox(text, self) 
     self.layout_of_frame.addWidget(checkbox) 
     self.checkBoxList.append(checkbox) 

截图:

enter image description here