【问题标题】:QTreeView Widget Default Size Takes Up Maximum Amount of Screen SpaceQTreeView Widget 默认大小占用最大屏幕空间
【发布时间】:2020-03-27 13:27:43
【问题描述】:

在下面的代码中,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 小部件以友好的方式共享屏幕

【问题讨论】:

    标签: python pyqt pyqt5 qtreeview


    【解决方案1】:

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

    每个widget的horizo​​ntalPolicy(widget.sizePolicy().horizontalPolicy())是:

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

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

    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, stretch=1)
            main_layout.addWidget(self.random_button, stretch=1)
    
            self.setCentralWidget(self.main_widget)
    
    
    if __name__ == "__main__":
        app = QApplication(sys.argv)
        window = TestClass()
        window.show()
        sys.exit(app.exec_())

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

    【讨论】:

    • 感谢您的提示,很明显我必须了解更多关于 Python 中的继承如何工作的信息。
    • @Mario 我建议你学习基本的 Python,尤其是自 Qt 以来的 OOP,因此 PyQt 大量使用它们。
    猜你喜欢
    • 1970-01-01
    • 2020-12-25
    • 2017-08-29
    • 2020-06-05
    • 2014-12-23
    • 1970-01-01
    • 2020-10-17
    • 1970-01-01
    相关资源
    最近更新 更多