pyqt5 tab area not filling the whole available space
我正在尝试使用GUI-我想拥有滚动条和选项卡。 我将滚动条作为"最外面的"窗口小部件进行了修补,内部装有QTabWidget,反之亦然:QTabWidget有一个QWidget选项卡,而QScrollArea的父级是该选项卡。 简而言之,我无法使滚动区域扩展以填充可用空间。 下面有一些注释可以说明我尝试过的一切。 调整sizePolicies似乎无济于事。
我看过其他人发布的类似问题,尤其是pyqt中的scrollarea问题?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | # -*- coding: utf-8 -*- """ Created on Fri Nov 17 07:07:08 2017 @author: Erik """ import sys from PyQt5.QtWidgets import QLayout, QVBoxLayout ,QTabWidget, QMainWindow,QApplication, QWidget, QSizePolicy, QScrollArea from PyQt5.QtGui import QColor, QPalette from PyQt5.QtCore import QSize class Color2(QWidget): def __init__(self, color, *args, **kwargs): super(Color2, self).__init__(*args, **kwargs) self.setAutoFillBackground(True) palette = self.palette() palette.setColor(QPalette.Window, QColor(color)) self.setPalette(palette) self.setSizePolicy(QSizePolicy(QSizePolicy.Maximum, QSizePolicy.Maximum)) def sizeHint(self): return QSize(250,150) class MyTableWidget(QWidget): def __init__(self, parent): super(QWidget, self).__init__(parent) self.layout = QVBoxLayout(self) # Initialize tab screen self.tabs = QTabWidget(self) self.layout.addWidget(self.tabs) #self.setSizePolicy(QSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored)) #self.tabs.setSizePolicy(QSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored)) def addTab(self, widget, text): self.tabs.addTab(widget, text) widget.setAutoFillBackground(True) my_yellow = QColor.fromHsl(35, 255, 153, 128 ) dark_blue = QColor.fromHsl(211, 196, 38, 255) widget.palette().setColor(QPalette.Window, dark_blue) widget.palette().setColor(QPalette.WindowText, my_yellow) class Example(QMainWindow): def __init__(self): super().__init__() self.initUI() def initUI(self): self.statusBar().showMessage('Ready') self.setGeometry(300, 300, 250, 150) self.setWindowTitle('Statusbar') self.table_widget = MyTableWidget(self) self.tab1 = QWidget() self.tab2 = QWidget() #self.tab1.setSizePolicy(QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)) self.table_widget.addTab(self.tab1,"Tab1") self.table_widget.addTab(self.tab2,"Tab2") self.scrollArea = QScrollArea(self.tab1) #self.scrollArea = QScrollArea(self) self.scrollArea.setWidgetResizable(True) self.scrollAreaWidgetContents = QWidget(self.scrollArea) #self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 380, 247)) self.scrollAreaWidgetContents.setMinimumSize(QSize(1100, 1300)) #self.scrollAreaWidgetContents.setSizePolicy(QSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored)) #self.scrollAreaWidgetContents.setWidgetResizable(True) #self.scrollArea.setWidget(self.scrollAreaWidgetContents) self.verticalLayout = QVBoxLayout(self.scrollAreaWidgetContents) #self.verticalLayout.addWidget(self.scrollArea) self.verticalLayout.addWidget(Color2('blue')) self.verticalLayout.addWidget(Color2('red')) self.verticalLayout.insertStretch(-1) #self.verticalLayout.setSizeConstraint(1)#QLayout.SizeConstraint.setNoConstraint) self.verticallayout2 = QVBoxLayout(self.tab2) self.verticallayout2.addWidget(Color2('green')) #self.scrollArea.setSizePolicy(QSizePolicy(QSizePolicy.Ignored, QSizePolicy.Expanding)) self.scrollArea.setWidget(self.scrollAreaWidgetContents) self.setCentralWidget(self.table_widget) self.show() print(self.table_widget.minimumSizeHint()) if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_()) |
我已经从http://zetcode.com/gui/pyqt5/了解了基础知识。
同样,上述代码的行为的一个线索是
问题是您不使用布局在选项卡内设置QScrollArea。 当您确定一个小部件是另一个小部件的父级时,仅表示该子级的坐标系是相对于父级的,而不是将其设为父级的大小,因此您必须使用布局,因为它可以处理父级的 尺寸。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | # -*- coding: utf-8 -*- """ Created on Fri Nov 17 07:07:08 2017 @author: Erik """ import sys from PyQt5.QtWidgets import QLayout, QVBoxLayout ,QTabWidget, QMainWindow,QApplication, QWidget, QSizePolicy, QScrollArea from PyQt5.QtGui import QColor, QPalette from PyQt5.QtCore import QSize class Color2(QWidget): def __init__(self, color, *args, **kwargs): super(Color2, self).__init__(*args, **kwargs) self.setAutoFillBackground(True) palette = self.palette() palette.setColor(QPalette.Window, QColor(color)) self.setPalette(palette) self.setSizePolicy(QSizePolicy(QSizePolicy.Maximum, QSizePolicy.Maximum)) def minimumSizeHint(self): return QSize(250,150) class MyTableWidget(QWidget): def __init__(self, parent): super(QWidget, self).__init__(parent) self.layout = QVBoxLayout(self) self.tabs = QTabWidget(self) self.layout.addWidget(self.tabs) def addTab(self, widget, text): self.tabs.addTab(widget, text) widget.setAutoFillBackground(True) my_yellow = QColor.fromHsl(35, 255, 153, 128 ) dark_blue = QColor.fromHsl(211, 196, 38, 255) widget.palette().setColor(QPalette.Window, dark_blue) widget.palette().setColor(QPalette.WindowText, my_yellow) class Example(QMainWindow): def __init__(self): super().__init__() self.initUI() def initUI(self): self.statusBar().showMessage('Ready') self.setGeometry(300, 300, 250, 150) self.setWindowTitle('Statusbar') self.table_widget = MyTableWidget(self) self.tab1 = QWidget() self.tab2 = QWidget() self.table_widget.addTab(self.tab1,"Tab1") self.table_widget.addTab(self.tab2,"Tab2") lay = QVBoxLayout(self.tab1) self.scrollArea = QScrollArea() lay.addWidget(self.scrollArea) self.scrollArea.setWidgetResizable(True) self.scrollAreaWidgetContents = QWidget() self.scrollArea.setWidget(self.scrollAreaWidgetContents) self.verticalLayout = QVBoxLayout(self.scrollAreaWidgetContents) self.verticalLayout.addWidget(Color2('blue')) self.verticalLayout.addWidget(Color2('red')) self.verticalLayout.insertStretch(-1) self.verticallayout2 = QVBoxLayout(self.tab2) self.verticallayout2.addWidget(Color2('green')) self.scrollArea.setWidget(self.scrollAreaWidgetContents) self.setCentralWidget(self.table_widget) self.show() if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_()) |