2017-06-26 8 views
0

私は、チェックボックス、フレーム、およびグリッドレイアウトオブジェクトを作成し、それらを独自のリストに格納しようとしています。PySide/PyQt:カスタムクラスを作成するには?

Qtのデザイナーからの出力は次のようになります。基本的にenter image description here

、私はCheckbox2とCheckbox3を保存するために、フレームやグリッドレイアウトを作成し、その後、CheckBox1をを作成したいです。その後checkboxList = []checkboxList.append(CreateCheckBox(self.frame_main, self.gridLayout_main, 0, 'Checkbox 1')(例えば)

これは出力を生成し、適切なオブジェクトを作成するための呼び出しでそれを追加する:

私のアプローチは、最初に私が作成していたオブジェクトを格納するための空のリストを作成することでした:enter image description here

作成したフレームは表示されません! 私は、このためのいくつかの可能な理由がある推測している:

  1. 私は
  2. 間違ったクラスを作成しています私は(つまり、initが私はそう何も返さない私が間違って作成されたオブジェクトを格納していますmは実際には何も格納していない?)彼らはなぜ私のクラスの実装のQt Designerとのコードのように動作していない

を表示していないよう

  • は私がきちんとメインフレームへの私のオブジェクトを追加していませんよどのように変更すれば同様の出力が得られますか?

    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_()) 
    

    とクラスとの私のコードは次のようになります。problema SE soluciona maquetando correctamente TUaplicación、エン・ラ・siguienteイマヘンSE

    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

    を言うの? – eyllanesc

    +0

    私はクラス 'CreateCheckBox(QtGui.QCheckBox)'を宣言するときにカスタムクラスを修正すべきだと考えています。これはすでにチェックボックスであり、新しい 'self.checkbox = QtGui.QCheckBox'を割り当てる必要はありません。 – PRMoureu

    +1

    私はあなたの質問を理解していません。基本的にQt Designerからインポートされた元のデザインを再作成するためにクラスを使用しようとしています。 –

    答えて

    2

    エルQMainWindowは、QMainWindowのさまざまな変更を反映しています。あなたのケースでは

    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) 
    

    スクリーンショット:あなたは私をもっとよく説明してもらえ、出力がどうあるべきか、あなたは2回あなたの機能を適用

    enter image description here

    関連する問題