如何在 PyQt 环境中将两个滚动条(垂直和水平)设置为同一个小部件?

How set two scroll bars (vertical and horizontal) to the same widget in PyQt environment?

我正在尝试为 QGroupBox 制作两个滚动条,但我只成功了一个(垂直的) 我不确定我需要做什么。

这是我的代码的一个简短示例:

from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
import sys


class SurfViewer(QMainWindow):
    def __init__(self, parent=None):
        super(SurfViewer, self).__init__()
        self.parent = parent

        self.centralTabs= QTabWidget()
        self.setCentralWidget(self.centralTabs)
        self.setFixedWidth(200)
        self.setFixedHeight(200)

        #tab Model selection
        self.tab_ModelSelect = QWidget()
        self.centralTabs.addTab(self.tab_ModelSelect,"Label")


        self.groupscrolllayouttest = QHBoxLayout()  
        self.groupscrollbartest = QGroupBox()  


        self.mainHBOX_param_scene = QVBoxLayout()
        for i in range(10):
            Label = QLabel('BlaBlaBlaBlaBlaBlaBlaBlaBlaBlaBlaBlaBlaBlaBlaBlaBlaBla')
            Label.setFixedWidth(200)
            self.mainHBOX_param_scene.addWidget(Label)


        #
        scroll = QScrollArea()
        scroll.setWidget(self.groupscrollbartest)
        scroll.setWidgetResizable(True)
        scroll.setFixedWidth(20)
        scroll.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded) 
        self.groupscrollbartest.setLayout(self.mainHBOX_param_scene)
        self.groupscrolllayouttest.addWidget(self.groupscrollbartest)
        self.groupscrolllayouttest.addWidget(scroll)


        self.tab_ModelSelect.setLayout(self.groupscrolllayouttest)

def main():
    app = QApplication(sys.argv)
    ex = SurfViewer(app)
    ex.setWindowTitle('window')
    # ex.showMaximized()
    ex.show()
    sys.exit(app.exec_( ))


if __name__ == '__main__':
    main()

结果如下:

在我更复杂的代码中,我使用了 QTabWidget,这就是我将它包含在这个例子中的原因。我想做的是在底部有一个水平滚动条,这样我就可以左右移动文本。显然我想保留另一个来上下移动文本。

我也尝试在第一个滚动条上添加第二个滚动条 (groupscrolllayouttest)

from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
import sys


class SurfViewer(QMainWindow):
    def __init__(self, parent=None):
        super(SurfViewer, self).__init__()
        self.parent = parent

        self.centralTabs= QTabWidget()
        self.setCentralWidget(self.centralTabs)
        self.setFixedWidth(200)
        self.setFixedHeight(200)

        #tab Model selection
        self.tab_ModelSelect = QWidget()
        self.centralTabs.addTab(self.tab_ModelSelect,"Label")


        self.groupscrolllayouttest2 = QVBoxLayout() ####
        self.groupscrollbartest2 = QGroupBox() ####

        self.groupscrolllayouttest = QHBoxLayout() ####
        self.groupscrollbartest = QGroupBox() ####


        self.mainHBOX_param_scene = QVBoxLayout()
        for i in range(10):
            Label = QLabel('BlaBlaBlaBlaBlaBlaBlaBlaBlaBlaBlaBlaBlaBlaBlaBlaBlaBla')
            Label.setFixedWidth(200)
            self.mainHBOX_param_scene.addWidget(Label)


        #
        scroll = QScrollArea()
        scroll.setWidget(self.groupscrollbartest)
        scroll.setWidgetResizable(True)
        scroll.setFixedWidth(20)
        scroll.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        # self.mainHBOX_param_scene.addWidget(scroll)
        self.groupscrollbartest.setLayout(self.mainHBOX_param_scene)
        self.groupscrolllayouttest.addWidget(self.groupscrollbartest)
        self.groupscrolllayouttest.addWidget(scroll)

        scroll2 = QScrollArea()
        scroll2.setWidget(self.groupscrollbartest2)
        scroll2.setWidgetResizable(True)
        scroll2.setFixedWidth(20)
        scroll2.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        scroll2.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        self.groupscrollbartest2.setLayout(self.groupscrolllayouttest)
        self.groupscrolllayouttest2.addWidget(self.groupscrollbartest2)
        self.groupscrolllayouttest2.addWidget(scroll2)


        self.tab_ModelSelect.setLayout(self.groupscrolllayouttest2)

def main():
    app = QApplication(sys.argv)
    ex = SurfViewer(app)
    ex.setWindowTitle('window')
    # ex.showMaximized()
    ex.show()
    sys.exit(app.exec_( ))


if __name__ == '__main__':
    main()

但我得到了一个奇怪的滚动条:

所以现在我卡住了。有什么想法吗?

您要做的是创建一个小部件,并在该小部件中放置 QGroupBox:

[...]
scroll = QScrollArea()
widget = QWidget(self)
widget.setLayout(QVBoxLayout())
widget.layout().addWidget(self.groupscrollbartest)
scroll.setWidget(widget)
scroll.setWidgetResizable(True)
self.groupscrollbartest.setLayout(self.mainHBOX_param_scene)
self.groupscrolllayouttest.addWidget(scroll)

self.tab_ModelSelect.setLayout(self.groupscrolllayouttest)
[...]

输出: