python - QTreeView 小部件默认大小占用最大屏幕空间

标签 python pyqt pyqt5 qtreeview

在下面的代码中,QTreeView 小部件始终占用最大空间,并为 QPushButton 小部件留下最小空间(代码后的图像)。如果 QTreeView 小部件被另一个 QPushButton 替换(当代码 #1 被注释掉,代码 #2 被注释时),那么两个按钮将获得相同的屏幕空间。如果 QPushButton 小部件被替换为两个 QTreeView 小部件,那么空间也会在两个小部件之间平均分配。

我的问题是,在屏幕空间方面,为什么 QTreeView 比 QPushButton 等其他小部件更受青睐?我该如何避免它(如何在两个小部件之间平均分配空间)?

到目前为止,我发现唯一有效的函数是 setFixedSize 或 setFixedWidth,这两个函数都不是首选解决方案。

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QMainWindow, QTreeView, QPushButton, QHBoxLayout


class TestClass(QMainWindow):

    def __init__(self):
        QMainWindow.__init__(self)

        self.main_window = QMainWindow()

        self.main_widget = QWidget()
        self.main_layout = QHBoxLayout()

        self.random_tree = QTreeView()  # <--- Code #1
        self.random_button = QPushButton('Test Button')
        # self.random_button_2 = QPushButton('Test Button')  # <--- Code #2

        self.main_layout.addWidget(self.random_tree)  # <--- Code #1
        self.main_layout.addWidget(self.random_button)
        # self.main_layout.addWidget(self.random_button_2)  # <--- Code #2

        self.main_widget.setLayout(self.main_layout)
        self.main_window.setCentralWidget(self.main_widget)

    def show(self):
        self.main_window.show()


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = TestClass()
    window.show()
    sys.exit(app.exec_())

以下是描述情况的图片:

QTreeView很自私

QPushButton 小部件以友好的方式共享屏幕

最佳答案

默认情况下,添加到布局中的项目的拉伸(stretch)因子为 0,在这种情况下,布局将考虑每个小部件的 QSizePolicy 来计算每个小部件的宽度,在这种情况下,它表明 QTreeView 将展开。

每个小部件的horizo​​ntalPolicy(widget.sizePolicy().horizo​​ntalPolicy())是:

QPushButton : QSizePolicy::Minimum
QTreeView   : QSizePolicy::Expanding  

解决方案是通过添加每个小部件来设置相同的拉伸(stretch)因子。

import sys
from PyQt5.QtWidgets import (
    QApplication,
    QWidget,
    QMainWindow,
    QTreeView,
    QPushButton,
    QHBoxLayout,
)


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

        self.random_tree = QTreeView()
        self.random_button = QPushButton("Test Button")

        self.main_widget = QWidget()

        main_layout = QHBoxLayout(self.main_widget)
        main_layout.addWidget(self.random_tree, <b>stretch=1</b>)
        main_layout.addWidget(self.random_button, <b>stretch=1</b>)

        self.setCentralWidget(self.main_widget)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = TestClass()
    window.show()
    sys.exit(app.exec_())

enter image description here

注意:您正在创建一个继承自 QMainWidow 的类,但您从未显示它,这至少对我来说似乎很奇怪,因此请重组其代码。

关于python - QTreeView 小部件默认大小占用最大屏幕空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59147305/

相关文章:

python Pandas : Rename a series within a dataframe?

python - PyQT 关闭并重新打开应用程序

python - 如何获取 QTreeWidget 可见区域中显示的所有项目?

python - 如何保存和恢复每个小部件实例唯一的小部件属性?

python - Pandas系列到numpy数组转换错误

python - pandas 中 int64 到 float64 的非自愿转换

python - 使用Scrapy在管道内的MYSQL数据库中的2个表上添加项目

python - 如果导入QtWebEngineWidgets,PyQt5崩溃

python - PyQT 段错误(有时)

python - PyQt点击图像的不同部分有各自的功能