2016-10-13 14 views
0

어디서나이 정확한 문제를 발견하지 못했거나 다른 사람이 인식하지 못했을 수 있습니다. 아직 프로그래밍에 초보자이지만 완전히 잊어 버리지는 않았지만 PyQt5로 응용 프로그램을 만들려고 시도하고 있지만 앞으로 더 심각한 코딩을하기 전에 레이아웃을 올바르게 설정하는 데 어려움을 겪고 있습니다.크기를 조정할 때 레이아웃을 깨지 않고 임의의 위젯에 PyQt5 고정 크기를 설정하는 방법

보시다시피, 저는 내부에 두 개의 QVBoxLayout 레이아웃이있는 QHBoxLayout을 사용하여 기본 레이아웃을 작성하려고합니다. 각 수직 레이아웃에 임의의 위젯을 던져 버렸습니다. 고정 된 크기로 지정하려고 할 때를 제외하고는 완전히 독립적으로 작동합니다. 왼쪽 세로 레이아웃의 ListWidget과 LineEdit은 그림에 표시된대로 수동으로 크기를 조정하면 고정 너비/높이/크기가 주어지면 원하는 위치 또는 원하는대로 유지되지 않습니다. 분명히 나는 ​​그들이 두 번째 구석과 그 뒤의 모든 위젯을 첫 번째, 두 번째 등의 바로 아래에두기를 원한다. 같은 것을 적용하려고 할 때마다 tabswidget에서도 같은 일이 발생한다.

나는 지오메트리, 사이즈 힌트, 정렬 등과 ​​함께 놀랐지 만, 나는 그것을 알아낼 수없는 것 같습니다. 문제의 두 사진에 묶는 링크 :

before resizing

after resizing

그리고 코드의 중요한 부분을 둘러싸 : 내가 잘못 뭐하는 거지

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) 

? 꼭 저에게 코드 응답을 줄 필요가 없습니다. 당신이 그것을 좋아하지 않는다면, 올바른 방향으로 나아가는 것만으로도 내 생각을 할 수 있습니다. 아니면 적어도 그렇게되기를 바랍니다.

답변

1

레이아웃에 스페이서를 추가 할 수 있습니다 (배치하는 위치에 따라 가로 또는 세로). 고정되지 않은 크기 정책을 설정할 수 있습니다. 이 방법으로 창 크기를 조정할 때마다 스페이서 만 늘어납니다 (또는 짧게).

+0

효과가있었습니다. 필요가 레이아웃 등의 적절한 추가와 함께 발생하면 탭 위젯의 내부에서 일할 것이라고 가정합니까? – JackTheCrab