2017-06-08 11 views
0

Ich bin ein bisschen neu zu diesem, also bin ich im Grunde nur kopieren die Dinge aus Tutorials, die ich getan habe, damit es funktioniert.Design zerquetschen zu Ecke PyQT5

Ich habe eine Designer.ui-Datei mit QtDesigner gemacht und jetzt habe ich es in Python-Code exportiert. Wenn ich den -x Befehl benutze, dann führe den Design Python aus, es funktioniert gut, aber wenn ich ihn in eine andere Datei importiere (damit ich Verbindungen herstellen kann), dann zerbricht alles auf 1 Platz anstatt auf der Grid Layout Basis zu bleiben.

Wenn ich meine Main.py-Datei (nicht Designer-Code) starten dann erhalte ich die Fehler QLayout: Attempting to add QLayout "" to MainWindow "MainWindow", which already has a layout aber ich sehe nicht, wo ich bin ein Layout in meinem Haupt Code hinzufügen ...

Mein Code ist : https://gist.github.com/crabcrabcam/3a6a9e847791117616d18ada0895f868

Danke für jede Hilfe :) Wenn Sie etwas mehr Zeug brauchen, fragen Sie einfach.

Antwort

1

Das Problem wird verursacht, weil die QMainWindow Klasse bereits ein Layout hat, wo die QStatusBar, QMenubar usw. platziert sind. Um es anzupassen, fügen Sie einfach QWidget mit dem setCentralWidget hinzu.

class Ui_MainWindow(object): 
    def setupUi(self, MainWindow): 
     MainWindow.setObjectName("MainWindow") 
     w = QtWidgets.QWidget(MainWindow) 
     MainWindow.setCentralWidget(w) 
     self.gridLayout = QtWidgets.QGridLayout(w) 
     self.gridLayout.setObjectName("gridLayout") 
     self.horizontalLayout = QtWidgets.QHBoxLayout() 
     self.horizontalLayout.setObjectName("horizontalLayout") 
     self.btnOpenFile = QtWidgets.QPushButton(MainWindow) 
     self.btnOpenFile.setObjectName("btnOpenFile") 
     self.horizontalLayout.addWidget(self.btnOpenFile) 
     self.btnSaveFile = QtWidgets.QPushButton(MainWindow) 
     self.btnSaveFile.setObjectName("btnSaveFile") 
     self.horizontalLayout.addWidget(self.btnSaveFile) 
     self.btnSendEmail = QtWidgets.QPushButton(MainWindow) 
     self.btnSendEmail.setObjectName("btnSendEmail") 
     self.horizontalLayout.addWidget(self.btnSendEmail) 
     self.gridLayout.addLayout(self.horizontalLayout, 0, 0, 1, 1) 
     self.txtEditMain = QtWidgets.QPlainTextEdit(MainWindow) 
     self.txtEditMain.setObjectName("txtEditMain") 
     self.gridLayout.addWidget(self.txtEditMain, 1, 0, 1, 1) 
     self.btnClear = QtWidgets.QPushButton(MainWindow) 
     self.btnClear.setObjectName("btnClear") 
     self.gridLayout.addWidget(self.btnClear, 2, 0, 1, 1) 

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

Eine andere Beobachtung, wenn Sie von einer Klasse erben, müssen Sie den Konstruktor dieser Klasse aufrufen. In Ihrem Fall erben Sie von QMainWindow, dann sollten Sie den QMainWindow Konstruktor aufrufen und nicht QWidget.

class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): 
    def __init__(self, parent=None): 
     QtWidgets.QMainWindow.__init__(self, parent=parent) 
     self.setupUi(self) 
+0

Aha! Vielen Dank. Das funktioniert. Wie kann ich den Designer dazu bringen, den 'w = QtWidgets.QWidget (MainWindow)' Teil hinzuzufügen? Oder muss ich einfach dorthin gehen und es jedes Mal hinzufügen. – crabcrabcam

+0

Er fügt es immer hinzu, es scheint mir seltsam, dass er es nicht getan hat, Sie haben nicht etwas eliminiert, als Sie es entworfen haben. – eyllanesc

+0

Ich stelle das Hauptlayout als Raster ein und lege dann ein horizontales Layout in ein Rasterfeld. Es könnte sein, dass die QWidget-Klasse ein Layout ist (jetzt geändert in Vertikal) – crabcrabcam