pyqt5 选项卡区域未填充整个可用 space
pyqt5 tab area not filling the whole available space
我正在试验 GUI - 我想要滚动条和选项卡。我修改了滚动条作为 "outer most" 小部件,里面有一个 QTabWidget,还有其他方法:QTabWidget 有一个 QWidget 选项卡,而 QScrollArea 的父项是选项卡。简而言之,我无法扩展滚动区域以填充可用 space。下面有一些评论说明了我尝试过的一切。没有调整 sizePolicies 似乎有帮助。
我看过其他人发布的类似问题,特别是 Issue with scrollarea in pyqt?
# -*- 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
class 的 sizeHint
相关。我有一个滚动条自己工作的例子......我不明白他们将它们放在 QTabWidget
的选项卡中的行为。有小费吗?非常感谢。
问题是您没有使用布局在选项卡内设置 QScrollArea。当您确定一个小部件是另一个小部件的父级时,您只是表明子级的坐标系是相对于父级的,而不是它会采用父级的大小,为此您必须使用布局,因为它处理尺寸。
# -*- 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_())
我正在试验 GUI - 我想要滚动条和选项卡。我修改了滚动条作为 "outer most" 小部件,里面有一个 QTabWidget,还有其他方法:QTabWidget 有一个 QWidget 选项卡,而 QScrollArea 的父项是选项卡。简而言之,我无法扩展滚动区域以填充可用 space。下面有一些评论说明了我尝试过的一切。没有调整 sizePolicies 似乎有帮助。 我看过其他人发布的类似问题,特别是 Issue with scrollarea in pyqt?
# -*- 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
class 的 sizeHint
相关。我有一个滚动条自己工作的例子......我不明白他们将它们放在 QTabWidget
的选项卡中的行为。有小费吗?非常感谢。
问题是您没有使用布局在选项卡内设置 QScrollArea。当您确定一个小部件是另一个小部件的父级时,您只是表明子级的坐标系是相对于父级的,而不是它会采用父级的大小,为此您必须使用布局,因为它处理尺寸。
# -*- 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_())