2017-09-21 4 views
0

Ich bin neu bei pyqt und versuche, eine Reihe von verschachtelten Containern zu erstellen, die meine Steuerelemente enthalten. Ich konnte keine Beispiele finden, die Widgets verschachteln (und sie layouted lassen). Ich konnte nur Layouts verschachteln, aber das möchte ich nicht erreichen. Ein Grund, warum ich das möchte, ist die Kontrolle über die Hintergrundfarbe meiner Container. Da Layouts keine Farbe haben, brauche ich QWidgets oder QFrames. Dies ist, wie weit ich gekommen:PYQT - Verschachteln von Widgets und Layouts in mehreren Ebenen

class AssetCreationWindow(QtWidgets.QMainWindow): 
    def __init__(self): 
     super(AssetCreationWindow, self).__init__() 
     self.create_content() 
     self.show() 

    def create_content(self): 

    # creating main container-frame, parent it to QWindow 
     self.main_CF = QtWidgets.QFrame(self) 
     self.main_CF.setStyleSheet('background-color: rgba(255, 0, 0, 1);') 
     self.setCentralWidget(self.main_CF) 
    # creating layout and parent it to main container 
    # is it correct, that main_CL now manages children of main_CF ? 
     self.main_CL = QtWidgets.QVBoxLayout(self.main_CF) 

    # creating the first subcontainer + layout, parenting it 
     asset_CGF = QtWidgets.QFrame(self.main_CF) 
     asset_CGF.setStyleSheet('background-color: rgba(0, 255, 0, 1);') 
     asset_CGL = QtWidgets.QHBoxLayout(asset_CGF) 

    # creating label and lineEdit, both are supposed to be on top of asset_CGF  
     asset_label = QtWidgets.QLabel("Assetname: ", asset_CGF) 
     asset_CGL.addWidget(asset_label) 
     asset_name = QtWidgets.QLineEdit("MyNewAsset", asset_CGF) 
     asset_CGL.addWidget(asset_name) 

    # doing the same with a second container 
     department_CGF = QtWidgets.QFrame(self.main_CF) 
     department_CGF.setStyleSheet('background-color: rgba(0, 0, 255, 1);') 
     department_CGL = QtWidgets.QHBoxLayout(department_CGF) 

     department_label = QtWidgets.QLabel("Department: ", department_CGF) 
     department_CGL.addWidget(department_label) 

     department_names = QtWidgets.QComboBox(department_CGF) 
     department_CGL.addWidget(department_names) 

Unfortunatly dieser Ansatz stapelt alle Widgets in der rechten oberen Ecke auf dem jeweils anderen. Ein anderes war, das ParentWidget von allen Layouts außer main_CL zu entfernen und addLayout() zu verwenden.

def create_content(self): 

    self.main_CF = QtWidgets.QFrame(self) 
    self.setCentralWidget(self.main_CF) 
    self.main_CL = QtWidgets.QVBoxLayout(self.main_CF) 

    asset_CGF = QtWidgets.QFrame(self.main_CF) 
    asset_CGF.setStyleSheet('background-color: rgba(255, 0, 0, 1);') 
    asset_CGL = QtWidgets.QHBoxLayout() 
    self.main_CL.addLayout(asset_CGL) 

    asset_label = QtWidgets.QLabel("Asset Name: ", asset_CGF) 
    asset_CGL.addWidget(asset_label) 
    asset_name = QtWidgets.QLineEdit("MyNewAsset", asset_CGF) 
    asset_CGL.addWidget(asset_name) 

    department_CGF = QtWidgets.QFrame(self.main_CF) 
    department_CGF.setStyleSheet('background-color: rgba(0, 255, 0, 1);') 
    department_CGL = QtWidgets.QHBoxLayout() 
    self.main_CL.addLayout(department_CGL) 

    department_label = QtWidgets.QLabel("Department: ", department_CGF) 
    department_CGL.addWidget(department_label) 
    department_names = QtWidgets.QComboBox(department_CGF) 
    department_CGL.addWidget(department_names) 

Das sieht besser aus in der Regel aber die untergeordneten Container-Layouts scheinen nicht wissen über die untergeordneten Container. Obwohl die Controller den Untercontainern zugeordnet sind, befinden sich die Controller nicht auf den Untercontainern. Die Untercontainer sind wieder in der oberen rechten Ecke gestapelt. Ich bin am Ende meines Wissens.

+1

Sie könnten ein Bild von dem zeigen, was Sie wollen. – eyllanesc

Antwort

0

Sie müssen das Layout für das Widget festlegen. Z. B

self.main_CL = QtWidgets.QVBoxLayout() 
self.main_CF.setLayout(self.main_CL) 

Dann explizit die Subwidgets in das Layout hinzuzufügen. Z.B.

self.main_CL.addWidget(self.asset_CGF) 

Folgen Sie dem gleichen Muster für Unterkomponenten.

self.asset_CGF.setLayout(self.asset_CGL) 
self.asset_CGL.addWidget(...) 

Eigentlich Ihr erstes Beispiel nur fehlt zwei Anrufe

self.main_CL.addWidget(self.asset_CGF) 
self.main_CL.addWidget(department_CGF) 
+0

Wenn Sie ein Elternteil an das Layout übergeben: 'self.main_CL = QtWidgets.QVBoxLayout (self.main_CF)', ist es ähnlich, ein Layout dem Eltern zuzuweisen: 'self.main_CF.setLayout (self.main_CL)' – eyllanesc

+0

In Mit anderen Worten, nur eine dieser Anweisungen ist notwendig. – eyllanesc

+0

Ja, dein Recht. Aktualisiert. –

0

Einschließlich Aleš Erjavecs Antwort, ist dies die Arbeits codeexample:

class AssetCreationWindow(QtWidgets.QMainWindow): 

def __init__(self, controller): 
    super(AssetCreationWindow, self).__init__() 
    self.controller = controller 
    self.create_content() 
    self.show() 

def create_content(self): 

# creating main container-frame, parent it to QWindow 
    self.main_CF = QtWidgets.QFrame(self) 
    self.main_CF.setStyleSheet('background-color: rgba(150, 0, 0, 1);') 
    self.setCentralWidget(self.main_CF) 
# creating layout and parent it to main container 
# is it correct, that main_CL now manages children of main_CF ? 
    self.main_CL = QtWidgets.QVBoxLayout(self.main_CF) 


# creating the first subcontainer + layout, parenting it 
    asset_CGF = QtWidgets.QFrame(self.main_CF) 
    self.main_CL.addWidget(asset_CGF) 
    asset_CGF.setStyleSheet('background-color: rgba(0, 150, 0, 1);') 
    asset_CGL = QtWidgets.QHBoxLayout(asset_CGF) 

# creating label and lineEdit, both are supposed to be on top of asset_CGF  
    asset_label = QtWidgets.QLabel("Assetname: ", asset_CGF) 
    asset_CGL.addWidget(asset_label) 
    asset_name = QtWidgets.QLineEdit("MyNewAsset", asset_CGF) 
    asset_CGL.addWidget(asset_name) 

# doing the same with a second container 
    department_CGF = QtWidgets.QFrame(self.main_CF) 
    self.main_CL.addWidget(department_CGF) 
    department_CGF.setStyleSheet('background-color: rgba(0, 0, 150, 1);') 
    department_CGL = QtWidgets.QHBoxLayout(department_CGF) 

    department_label = QtWidgets.QLabel("Department: ", department_CGF) 
    department_CGL.addWidget(department_label) 

    department_names = QtWidgets.QComboBox(department_CGF) 
    department_CGL.addWidget(department_names) 

Es ergibt dies: window with nested QWidgets

Verwandte Themen