2016-04-17 8 views
0

Ich bin neu bei pyQt und bin ein bisschen fest davon, wie die Layouts und Widgets funktionieren. Mein Verständnis ist, dass ich ein neues Widget erstellen muss, dann ein Layout (z. B. GridLayout) zu diesem Widget hinzufügen und dann dieses Layout auf das Hauptfenster festlegen. Die unten funktioniert nicht, wie ich gehofft hatte, und ich bin nicht sicher, wo man von hier geht:Wie man einem Widget ein Layout hinzufügt und dann ein Widget zum Hauptfenster hinzufügt

self.grid_widget = QtGui.QWidget(self) 
self.grid_widget.setGeometry(120,10,500,235) 
gridPalette = self.grid_widget.palette() 
gridPalette.setColor(self.grid_widget.backgroundRole(), QtGui.QColor('white')) 
self.grid_widget.setPalette(gridPalette) 

grid = QtGui.QGridLayout() 
self.grid_widget.setLayout(grid)    
self.setLayout(self.grid_widget) 

Ich brauche im Grunde das Widget in einem bestimmten Ort zu sein (wo ich Geometrie festgelegt haben). Ich könnte einfach das Gitter zum Fenster hinzufügen, aber dann bedeckt das Gitter das gesamte Fenster und nicht dort, wo ich es platzieren möchte.

Wenn jemand die Pipeline dafür erklären könnte, wäre das extrem praktisch!

Antwort

0

In PyQT Sie in der Regel mit einem "Hauptfenster" starten. Normalerweise mache ich eine Unterklasse von QtGui.QMainWindow für diesen Zweck. Das von dieser Klasse instantiierte Objekt ist mein "Hauptfenster". Als nächstes mache ich eine Unterklasse von QtGui.QWidget. Ich mache ein Objekt aus dieser Klasse, nenne es mein "Haupt-Widget" und lege es zentral in das "Hauptfenster". Weisen Sie diesem "Hauptwidget" ein Layout zu und Sie können damit beginnen, untergeordnete Widgets hinzuzufügen. Das Layout stellt sicher, dass die untergeordneten Widgets gut ausgerichtet sind. So ist es etwa so:

from PyQt4 import QtGui 
from PyQt4 import QtCore 
import sys 

class CustomMainWindow(QtGui.QMainWindow): 

    def __init__(self): 
     super(CustomMainWindow, self).__init__() 
     self.setGeometry(300, 300, 800, 800) 
     self.setWindowTitle("my first window") 

     self.mainWidget = CustomMainWidget(self) 
     self.setCentralWidget(self.mainWidget) 
     ... 
     self.show() 

''' End Class ''' 

class CustomMainWidget(QtGui.QWidget): 

    def __init__(self, parent): 
     super(CustomMainWidget, self).__init__(parent) 
     self.mainLayout = None 
     self.initLayout() 
     self.putSomeWidgetInTheLayout() 
     ... 
    def initLayout(self): 
     # When you use a layout, you do not need to pass a parent when 
     # constructing the child widgets. The layout will automatically 
     # reparent the widgets (using QWidget::setParent()) so that they 
     # are children of the widget on which the layout is installed. 
     # Widgets can only have other widgets as parent, not layouts. 
     self.mainLayout = QtGui.QGridLayout() 
     self.setLayout(self.mainLayout) 

    def putSomeWidgetInTheLayout(self): 
     # Notice that I don't assign a parent to 'lbl1'! 
     lbl1 = QtGui.QLabel("My label") 
     setCustomSize(lbl1, 160, 40) 
     self.mainLayout.addWidget(lbl1, *(0,0)) 
     # -> I just added the label widget to the layout 
     # of the main (central) widget. The label widget 
     # had no parent widget to begin with. But by adding 
     # it to the layout, the layout will 'reparent' the 
     # label widget. So from now on, the label widget is 
     # a child of the 'main (central) widget'. 

     lbl2 = QtGui.QLabel("My second label") 
     setCustomSize(lbl2, 160, 40) 
     self.mainLayout.addWidget(lbl2, *(0,1)) 

''' End Class ''' 

def setCustomSize(x, width, height): 
    sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) 
    sizePolicy.setHorizontalStretch(0) 
    sizePolicy.setVerticalStretch(0) 
    sizePolicy.setHeightForWidth(x.sizePolicy().hasHeightForWidth()) 
    x.setSizePolicy(sizePolicy) 
    x.setMinimumSize(QtCore.QSize(width, height)) 
    x.setMaximumSize(QtCore.QSize(width, height)) 

if __name__== '__main__': 
    app = QtGui.QApplication(sys.argv) 
    myWindow = CustomMainWindow() 
    sys.exit(app.exec_()) 

Ich hoffe, das war hilfreich. Wenn Sie noch Fragen haben, würde ich mich freuen, Ihnen zu helfen.

Verwandte Themen