【发布时间】:2022-01-19 02:05:26
【问题描述】:
我有 PyQt5 QLabels,它们会随着 QMainWindow 大小的变化而扩展/收缩。当 QMainWindow 的大小调整到其初始尺寸以外的任何尺寸时,我想获取 QLabels 的尺寸。
下面的脚本在 QMainWindow 中创建了两个 QLabel。 QLabel 扩展,但顶部 QLabel 具有固定高度。 QMainWindow 的创建尺寸为 400x300,并显示为使用 showMaximized() 最大化的屏幕(在我的情况下为 1920 x 1080)。该脚本在 QMainWindow 显示之前和之后打印 QLabels 的尺寸。在显示之前,width() 和 height() 返回默认 QLabel 值,在显示(屏幕最大化)之后width() 和 height() 返回值,就好像 QMainWindow 的物理尺寸为 400x300。这是 wat 打印出来的:
label_1 Size Before Expanding: 100 100
label_2 Size Before Expanding: 100 30
label_1 Size After Expanding: 378 100
label_2 Size After Expanding: 378 171
当 QMainWindow 最大化时,如何获得 QLabels 的真实尺寸?我在 Windows 环境中运行。
from PyQt5.QtWidgets import QApplication, QMainWindow, QSizePolicy, QLabel, QVBoxLayout, QWidget
import sys
class MainWindow(QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
central_widget = QWidget()
self.setCentralWidget(central_widget)
self.setGeometry(100, 100, 400, 300)
self.layout = QVBoxLayout(central_widget)
self.label_1 = QLabel(self)
self.label_1.setStyleSheet('background-color: green')
self.label_1.setFixedHeight(100)
sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
self.label_1.setSizePolicy(sizePolicy)
self.layout.addWidget(self.label_1)
self.label_2 = QLabel(self)
self.label_2.setStyleSheet('background-color: red')
sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
self.label_2.setSizePolicy(sizePolicy)
self.layout.addWidget(self.label_2)
print('label_1 Size Before Expanding: ', self.label_1.width(), self.label_1.height())
print('label_2 Size Before Expanding: ', self.label_2.width(), self.label_2.height())
self.showMaximized()
print('label_1 Size After Expanding: ', self.label_1.width(), self.label_1.height())
print('label_2 Size After Expanding: ', self.label_2.width(), self.label_2.height())
if __name__ == '__main__':
app = QApplication(sys.argv)
w = MainWindow()
app.exec()
【问题讨论】:
-
只是出于好奇,您为什么需要知道这些?
-
我有两个垂直裁剪的视频窗口。我认为在隐藏另一个窗口及其水平和垂直滑块时强制它们到全屏尺寸将使它们无法调整大小。感谢您引导我进行 resizeEvent - 我认为这会起作用。
-
抱歉,我不明白:“两个垂直裁剪的视频窗口”是什么意思?为什么最大化应该防止在隐藏小部件时调整剩余小部件的大小?我开始认为你问这个问题的原因是错误的。
-
我有两个垂直堆叠的视频窗口,每个都有一个水平滑块(仅在回放期间)。我有两个实时视频流进来。对于每个流,我裁剪到中间的 50%,将其写入记录器并显示它。在重播模式下,未重播的窗口消失(隐藏()),但重播视频的窗口改变了尺寸,这是我不想要的。我尝试了不同的大小策略、屏蔽等。主窗口将始终最大化。我认为如果我在最大化后将 QLabel 大小策略更改为 Fixed,那么它们将不会更改维度。这应该是一个简单的解决方案
-
我不确定我是否理解您的要求:如果视频小部件被隐藏,预期的结果是什么?主窗口是否应该保持其最大化大小,并且只是隐藏视频小部件,在窗口上留下“空白”空间?或者您想相应地调整主窗口的大小(因此,使其垂直变小)?在第一种情况下,使用
setRetainSizeWhenHidden()。第二个稍微复杂一点:最大化的窗口不能调整大小,你必须再次使其正常并手动更新其几何形状。
标签: pyqt5 pyside2 qwidget dimensions qlabel