如何使 PyQt5 QScrollArea 水平滚动条动态显示?

How to make PyQt5 QScrollArea horizontal scrollbar show up dynamically?

我创建了一个QScrollArea来显示目录树和文件树。当该区域显示目录或文件时,会出现垂直滚动条,但水平滚动条不会出现。这是代码(实际代码非常多,所以我只展示相关部分):

class SomeWidget(QWidget):
    def __init__(self, parent):
        super(QWidget, self).__init__(parent)

    def DirectoryOrFileSelection(self):
        layoutOne = QVBoxLayout()
        self.treeview_tabs = QTabWidget()
        self.directoryView = QScrollArea(widgetResizable=True) #QWidget()
        self.directoryView.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        self.filesView = QScrollArea(widgetResizable=True) #QWidget()
        self.filesView.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        self.treeview_tabs.addTab(self.directoryView, "Dirs")
        self.treeview_tabs.addTab(self.filesView, "Files")
        theHBoxLayout = QHBoxLayout()
        leftSpacing = 4
        theHBoxLayout.addWidget(self.treeview_tabs, leftSpacing)
        layoutOne.addLayout(theHBoxLayout)
        self.layout.addLayout(layoutOne)

这是不需要滚动条时的样子。

当我将主 window 变小时,垂直滚动条会立即出现。

但是,当我展开其中一个目录时,即使文件名超出了可见区域,水平滚动条也没有出现。

如果我使用 Qt.ScrollBarAlwaysOn 代替 Qt.ScrollBarAsNeeded,则会出现一个不活动的滚动条,并且永远不会变为活动状态。

谁能帮忙解决一下如何在必要时激活水平滚动条?我需要能够水平滚动才能看到完整的文件名。

更新: 根据收到的建议,我将 setHorizontalScrollBarPolicy 直接应用到 QTreeView,但即使出现滚动条并且看起来它处于活动状态, 它似乎无法识别内容何时超出视图区域。如下图所示。

不需要将视图添加到另一个滚动区域,因为所有 Qt 项目视图都是滚动区域。

注意,与QTableView的header不同,QTreeView的header自动stretches the last section:

Note: The horizontal headers provided by QTreeView are configured with this property set to true, ensuring that the view does not waste any of the space assigned to it for its header. If this value is set to true, this property will override the resize mode set on the last section in the header.

这意味着如果您只显示树的第一列,文件和目录的名称将始终被删除 如果它们的宽度超过了小部件的宽度,水平滚动条即使一直显示也不会激活

treeview.header().setStretchLastSection(False)
treeview.header().setSectionResizeMode(QHeaderView.ResizeToContents)