我最近一直在开发一个将在 PySide2 中的触摸屏上运行的 GUI,我想通过在触摸屏上轻拂来实现滚动。据我所知,最好的方法是使用 QScroller。我尝试用这个来实现它,但我不喜欢滚动条如何允许水平滚动,即使我禁用了水平滚动条。我在网上看到应该可以通过修改scrollerProperties来禁用它。但是,每当我尝试获取或设置滚动条属性时,整个程序都会立即崩溃。我有以下示例,它重现了我的问题:
from PySide2.QtCore import QSize, QPoint, Qt
from PySide2.QtWidgets import QMainWindow, QWidget, QApplication, QLabel, QScrollArea, QScroller
class ScrollerCrash(QMainWindow):
def __init__(self):
QMainWindow.__init__(self, None)
self.setFixedSize(500, 500)
self._window = QWidget()
self.setCentralWidget(self._window)
self.labels = []
self.panel = QWidget(self)
self.panel.resize(QSize(500, 10000))
for i in range(0, 100):
label = QLabel(self.panel)
label.setText(f'Label {i}')
label.resize(QSize(500, 100))
label.move(QPoint(0, i * 100))
label.show()
self.labels.append(label)
self.scroll_area = QScrollArea(self)
self.scroll_area.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.scroll_area.horizontalScrollBar().setEnabled(False)
self.scroll_area.resize(QSize(500, 500))
self.scroll_area.show()
self.scroll_area.setWidget(self.panel)
self.scroller = QScroller(self.scroll_area)
self.scroller.grabGesture(self.scroll_area, QScroller.TouchGesture)
self.scroller.grabGesture(self.scroll_area, QScroller.LeftMouseButtonGesture)
print('before getting properties')
self.props = self.scroller.scrollerProperties() # Causes a seg fault
print('after getting properties')
if __name__ == '__main__':
application = QApplication()
test = ScrollerCrash()
test.show()
application.exec_()
我的PySide2版本是5.15.10。
我想不出任何方法来解决这个问题。我是否缺少某些东西,或者是否有更好的方法来完成我正在做的事情?谢谢!
感谢musicamante,就像使用QScroller.scroller()一样简单,而不是直接创建一个QScroller。当我查看文档时,我不知何故错过了这一点。