我使用Pyside2来创建一个简单的UI。我对Qt(和一般的Python)非常陌生。我已经能够使我的滚动区域在Qt工作与更简单的设置,但我没有能够得到以下设置显示任何滚动条,也不让我调整我的窗口大小。高度总是固定的。
如果内容超出屏幕/窗口边界,我希望主布局中的所有内容都是可滚动的。
我也不希望Qt窗口总是有内容的高度(我怀疑这是因为我没有在QVBoxLayout中正确定义的东西)。
非常感谢您的帮助和建议!from PySide2 import QtWidgets
class Test:
def __init__(self):
self._window = QtWidgets.QMainWindow()
self._widget = QtWidgets.QWidget()
self._window.resize(200, 200)
self._window.setWindowTitle('My Scrollbar Test')
self._window.setCentralWidget(self._widget)
# Create a box layout
self._mainLayout = QtWidgets.QVBoxLayout(self._widget)
self._mainLayout.setContentsMargins(0,0,0,0)
self._mainLayout.setSpacing(0)
self._widget.setLayout(self._mainLayout)
# Create a scroll area
self._scrollAreaWidget = QtWidgets.QScrollArea()
# Assign a QWidget to the scroll widget
self._contentWidget = QtWidgets.QWidget()
self._scrollAreaWidget.setWidget(self._contentWidget)
self._scrollAreaWidget.setWidgetResizable(True)
self._layout = QtWidgets.QVBoxLayout(self._contentWidget)
self._contentWidget.setLayout(self._layout)
# Add tabs
self._tabWidget = QtWidgets.QTabWidget()
self._tabWidget.addTab(self.createTabOneLayout(), 'Test 1')
self._tabWidget.addTab(self.createTabOneLayout(), 'Test 2')
self._tabWidget.setTabPosition(QtWidgets.QTabWidget.East)
self._layout.addWidget(self._tabWidget)
# Add widget containing scroll area to the main layout
self._mainLayout.addWidget(self._contentWidget)
self._window.show()
# Tab function
def createTabOneLayout(self):
self._newTab = QtWidgets.QWidget()
self._tabLayout = QtWidgets.QVBoxLayout(self._newTab)
# Add buttons
for a in "ABCDEFGHIJKLMNOPQRSTUVWXYZ":
self._newButton = QtWidgets.QPushButton(a)
self._newButton.setFixedSize(50,50)
self._tabLayout.addWidget(self._newButton)
return self._newTab
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
t = Test()
sys.exit(app.exec_())
你不应该将self._contentWidget
添加到主布局中,因为它是滚动区域的一部分,你应该将滚动区域添加到它。
您应该添加以下行:
self._mainLayout.addWidget(self._scrollAreaWidget)
并删除此:
self._mainLayout.addWidget(self._contentWidget)
考虑你的代码比它应该的更复杂:
- 如果你只有一个滚动区域,没有其他的"小部件,您应该将其设置为中心小部件;
- 如果你只有一个QTabWidget滚动区域,您应该将其设置为主要部件的滚动区域;
还要考虑PyQt惯例是为主部件(顶层窗口)使用子类,因此最好直接从QMainWindow继承Test
类。这使得代码更干净,也允许更容易地覆盖现有的方法。
另外,如果您有一个动态创建新元素的函数,为它们设置实例属性是完全无用的(并且可能导致混淆):新的小部件是用父组件创建的(或者它们的所有权被父组件获取),因此不需要持久引用(self.someObject
而不是本地someObject
),无论何时再次调用该函数,它都会被覆盖。这对函数和for
循环都有效。
class Test(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
self.resize(200, 200)
self.setWindowTitle('My Scrollbar Test')
# Create a scroll area
self._scrollAreaWidget = QtWidgets.QScrollArea()
self.setCentralWidget(self._scrollAreaWidget)
# Add tabs
self._tabWidget = QtWidgets.QTabWidget()
self._tabWidget.addTab(self.createTabOneLayout(), 'Test 1')
self._tabWidget.addTab(self.createTabOneLayout(), 'Test 2')
self._tabWidget.setTabPosition(QtWidgets.QTabWidget.East)
self._scrollAreaWidget.setWidget(self._tabWidget)
self._scrollAreaWidget.setWidgetResizable(True)
self.show()
def createTabOneLayout(self):
newTab = QtWidgets.QWidget()
tabLayout = QtWidgets.QVBoxLayout(newTab)
# Add buttons
for a in "ABCDEFGHIJKLMNOPQRSTUVWXYZ":
newButton = QtWidgets.QPushButton(a)
newButton.setFixedSize(50,50)
tabLayout.addWidget(newButton)
return newTab