QTreeView 小部件默认大小占用最大屏幕量Space
QTreeView Widget Default Size Takes Up Maximum Amount of Screen Space
在下面的代码中,QTreeView 小部件始终占用最大值 space 并为 QPushButton 小部件保留最小值 space(代码后的图像)。如果 QTreeView 小部件被另一个 QPushButton 替换(当代码 #1 被注释掉,代码 #2 被注释掉时),那么两个按钮都会获得相同数量的屏幕 space。如果 QPushButton 小部件被两个 QTreeView 小部件替换,那么 space 也会在两个小部件之间平分。
我的问题是,为什么 QTreeView 在屏幕 space 方面比 QPushButton 等其他小部件更受欢迎,我该如何避免它(如何在两个小部件之间平均分配 space)?
到目前为止,我发现唯一有效的函数是 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 小部件以友好的方式共享屏幕
默认情况下,添加到布局的项目的拉伸因子为 0,在这种情况下,布局将考虑每个小部件的 QSizePolicy 来计算每个小部件的宽度,在这种情况下,它指出QTreeView 将展开。
每个widget的horizontalPolicy(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, <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_())
注意:您正在创建一个继承自 QMainWidow 的 class,但您从未显示它,这至少对我来说似乎很奇怪,因此请重组其代码。
在下面的代码中,QTreeView 小部件始终占用最大值 space 并为 QPushButton 小部件保留最小值 space(代码后的图像)。如果 QTreeView 小部件被另一个 QPushButton 替换(当代码 #1 被注释掉,代码 #2 被注释掉时),那么两个按钮都会获得相同数量的屏幕 space。如果 QPushButton 小部件被两个 QTreeView 小部件替换,那么 space 也会在两个小部件之间平分。
我的问题是,为什么 QTreeView 在屏幕 space 方面比 QPushButton 等其他小部件更受欢迎,我该如何避免它(如何在两个小部件之间平均分配 space)?
到目前为止,我发现唯一有效的函数是 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 小部件以友好的方式共享屏幕
默认情况下,添加到布局的项目的拉伸因子为 0,在这种情况下,布局将考虑每个小部件的 QSizePolicy 来计算每个小部件的宽度,在这种情况下,它指出QTreeView 将展开。
每个widget的horizontalPolicy(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, <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_())
注意:您正在创建一个继承自 QMainWidow 的 class,但您从未显示它,这至少对我来说似乎很奇怪,因此请重组其代码。