关于python:pyqt5选项卡区域未填满整个可用空间

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实际使用的区域与Color2类的sizeHint相关。 我有一个滚动条可以单独工作的示例……这只是我不理解的将它们放在QTabWidget选项卡中的行为。 有小费吗? 非常感谢。


问题是您不使用布局在选项卡内设置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_())

enter image description here