2016-10-13 6 views
0

Haben Sie dieses genaue Problem nirgendwo gefunden, oder vielleicht erkenne ich es einfach nicht von anderen. Als Programmierer noch ein Anfänger, aber nicht völlig blind, versuche ich, eine Anwendung mit PyQt5 zu erstellen, aber ich habe Schwierigkeiten, das Layout richtig einzurichten, bevor ich in der Zukunft noch ernsthaftere Programmierung mache.Wie Sie eine feste Größe in PyQt5 für jedes Widget festlegen, ohne das Layout beim Ändern der Größe zu ändern

Wie Sie sehen werden, versuche ich, mein Hauptlayout durch Verwendung eines QHBoxLayout mit zwei QVBoxLayout-Layouts zu machen. Ich habe einige zufällige Widgets in jedes vertikale Layout geworfen, die perfekt funktionieren, außer wenn ich versuche, ihnen eine feste Größe zu geben. Das ListWidget und LineEdit im linken vertikalen Layout bleiben nicht, wo ich sie haben möchte oder wie ich sie haben möchte, wenn ich eine feste Breite/Höhe/Größe habe, nachdem ich die App Windon manuell verändert habe, wie in Bildern zu sehen. Offensichtlich möchte ich, dass sie in der oberen linken Ecke bleiben und jedes nachfolgende Widget direkt unter dem ersten, zweiten usw. Dasselbe passiert mit dem Tabswidget, wenn ich versuche, dasselbe anzuwenden.

Ich habe mit Geometrie, Größenhinweisen, Ausrichtungen usw. herumgespielt, aber ich kann es einfach nicht herausfinden. Enclosing Links zu zwei Bilder des Problems:

before resizing

after resizing

Und den wichtigen Teil des Codes einschließt:

class MainWindow(QMainWindow): 
    def __init__(self): 
     super(MainWindow, self).__init__() 
     self.initUI() 
     self.createactions() 
     self.createmenus() 
     self.createtoolbar() 
     self.container = FrameContainer() 
     self.setCentralWidget(self.container) 



    def initUI(self): 

     self.setWindowTitle(self.title) 
     self.setGeometry(100,100,800,600) 
     self.statusBar().showMessage("Statusbar - awaiting user control") 
     self.show() 



class FrameContainer(QWidget): 

    def __init__(self): 
     super(QWidget, self).__init__() 
     self.setContentsMargins(0,0,0,0) 
     self.mainlayout = QHBoxLayout(self) 
     self.mainlayout.setSpacing(0) 
     self.mainlayout.setContentsMargins(0, 0, 0, 0) 
     self.verticalwidgets() 

     self.mainlayout.addLayout(self.box_layout1) 
     self.mainlayout.addLayout(self.box_layout2) 


    def verticalwidgets(self): 
     # Left side 
     self.box_layout1 = QVBoxLayout() 
     self.box_layout1.setContentsMargins(0,0,0,0) 
     self.box_layout1.setSpacing(0) 
     self.list_widget = QListWidget() 
     self.list_widget.setFixedSize(200,500) 
     self.list_widget.sizeHintForColumn(0) 
     self.someWidget3 = QLineEdit() 
     self.someWidget3.setFixedWidth(200) 
     self.box_layout1.addWidget(self.list_widget, Qt.AlignLeft) 
     self.box_layout1.addWidget(self.someWidget3, Qt.AlignLeft) 

     # Right side 
     self.box_layout2 = QVBoxLayout() 
     self.box_layout2.setContentsMargins(0,0,0,0) 
     self.box_layout2.setGeometry(QRect(0, 0, 800, 680)) 
     self.tabs_widget = TabsWidget(self) 
     self.box_layout2.addWidget(self.tabs_widget) 


class TabsWidget(QWidget): 

    def __init__(self, child): 
     super(QWidget, self).__init__() 
     self.layout = QHBoxLayout(self) 
     self.layout.setContentsMargins(0,0,0,0) 


     self.tabs = QTabWidget() 
     self.tabs.setTabsClosable(True) 
     self.tab1 = QWidget() 
     self.tab2 = QWidget() 
     self.tab3 = QWidget() 

     # Add tabs 
     self.tabs.addTab(self.tab1, "Tab 1") 
     self.tabs.addTab(self.tab2, "Tab 2") 
     self.tabs.addTab(self.tab3, "Tab 3") 

     # Create first tab 
     self.tab1.layout = QVBoxLayout(self) 
     self.pushButton1 = QPushButton("Button 1") 
     self.pushButton2 = QPushButton("Button 2") 
     self.pushButton3 = QPushButton("Button 3") 
     self.tab1.layout.addWidget(self.pushButton1) 
     self.tab1.layout.addWidget(self.pushButton2) 
     self.tab1.layout.addWidget(self.pushButton3) 
     self.tab2.layout = QVBoxLayout(self) 
     self.tab2.layout.addWidget(QLabel("Peterpaned")) 
     self.tab2.layout.addWidget(QLineEdit()) 
     self.tab1.setLayout(self.tab1.layout) 
     self.tab2.setLayout(self.tab2.layout) 

     # Add tabs to widget 
     self.layout.addWidget(self.tabs) 

Was mache ich falsch? Muss mir nicht unbedingt die Code-Antwort geben, es sei denn, du fühlst es so, ein ernsthafter Schub in die richtige Richtung würde ich denken, oder zumindest hoffe ich es.

Antwort

1

Sie können Abstandhalter in Ihrem Layout hinzufügen (horizontal oder vertikal, je nachdem, wo Sie sie platzieren) und eine Richtlinie für nicht feste Größen festlegen. Auf diese Weise werden immer dann, wenn das Fenster in der Größe geändert wird, nur die Abstandshalter gedehnt (oder gekürzt).

+0

Es hat funktioniert! Ich gehe davon aus, dass es auch innerhalb des Tabs-Widgets funktionieren würde, wenn es beim richtigen Hinzufügen von Layouts usw. erforderlich wäre. – JackTheCrab

Verwandte Themen