python - 为什么 Qt.AlignCenter onQLabel 在 PyQt5 中的图像和文本不同?
问题描述
我是 python 新手,目前正在做一些基本的练习。我正在尝试重写一些我使用 tkinter 对 PyQt5 执行相同操作的应用程序。除了一个问题外,一切正常 - 我有一个包含图像的 QLabel,我试图将图像对齐在标签的中心,但它不想,图像保持与左侧对齐。@eyllanesc 回答了这个问题,他建议 QLabel 没有相对于窗口居中,我应该通过更改为:
layout.addWidget(label_img, alignment=Qt.AlignCenter)
而且效果很好,但是在同一布局中还有两个小部件(label_top,label_bottom),带有文本标签。尽管没有与窗口中心对齐,但显示的文本居中。为什么带有文本的标签与带有图像的标签的行为不同?
下面的代码:
from PyQt5.QtWidgets import QApplication, QLabel, QWidget, QVBoxLayout, QPushButton, QFileDialog
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QIcon, QPixmap
app=QApplication([])
window=QWidget()
window.setFixedSize(500,500)
layout=QVBoxLayout()
label_top=QLabel('PLEASE WAIT')
label_top.setAlignment(Qt.AlignCenter)
label_top.setStyleSheet("font: 20pt Bahnschrift; background-color: #ffd167; color: black")
layout.addWidget(label_top)
label_img=QLabel()
label_img.setFixedSize(300, 300)
label_img.setAlignment(Qt.AlignCenter)
image = QFileDialog.getOpenFileName(None,'Select file','D:\_Download', "Image files(*.png *.jpg *.jpeg *.gif)")
imagePath = image[0]
pixmap = QPixmap(imagePath)
pixmap.scaledToHeight(label_img.height(), Qt.SmoothTransformation)
label_img.setPixmap(pixmap)
#label_img.resize(pixmap.width(),pixmap.height())
layout.addWidget(label_img, alignment=Qt.AlignCenter)
label_bottom=QLabel('PLEASE WAIT')
label_bottom.setAlignment(Qt.AlignCenter)
label_bottom.setStyleSheet("font: 20pt Bahnschrift; background-color: #ffd167; color: black")
layout.addWidget(label_bottom)
window.setLayout(layout)
window.show()
app.setStyle('Fusion')
app.exec_()
解决方案
首先,必须理解这意味着label.setAlignment(Qt.AlignCenter)
,该代码表示在 QLabel 中显示的元素(QPixmap 或文本)将在 QLabel 的中心,而不是在窗口的中心。
在示例中,差异由标签的大小给出,因为第一个和第三个标签没有固定大小,而第二个标签的大小为 300x500,因此没有固定大小的 QLabel 的行为是占据整个空间可能如以下代码所示:
from PyQt5.QtWidgets import QApplication, QLabel, QWidget, QVBoxLayout
if __name__ == '__main__':
app=QApplication([])
window=QWidget()
window.setFixedSize(500,500)
label_top=QLabel()
label_top.setStyleSheet("background-color: red;")
label_img=QLabel()
label_img.setFixedSize(300, 300)
label_img.setStyleSheet("background-color: green;")
label_bottom=QLabel()
label_bottom.setStyleSheet("background-color: blue;")
layout=QVBoxLayout(window)
layout.addWidget(label_top)
layout.addWidget(label_img)
layout.addWidget(label_bottom)
window.show()
app.exec_()
因此,在没有像第一个和第三个那样的固定大小的 QLabel 中,与第二个不同的是,相对于窗口的对齐是无关紧要的,因为如果您希望 QLabel 的内容(文本或图像)相对于窗口居中这也必须居中。
例如,其他解决方案是:
- 不要将固定大小设置为宽度,而仅设置为高度。
- 确定中间 QLabel 的宽度为 500。
推荐阅读
- python - 搜索多个不同匹配项时如何找到子字符串的索引?
- unity3d - 如何将从 .X 导入的 Matrix4x4 转换为 Unity?
- python - VS Code中Python的Theano属性错误/循环导入部分初始化模块问题
- image-size - 在 Luna 主题中更改产品图像大小
- python - Flask-Migrate 不能降级到带有合并头的 down_revision
- java - 未解析的类名:android studio 中的 com.google.inject.Binder 和 com.google.inject.Inject
- react-native - 未找到 React Native 模块:无法使用 react-native-router-flux 解析“@react-navigation/core”
- c# - 如何通过代码访问 T4 输出文件的名称?
- yarnpkg - 如何在纱线中设置无代理
- presto - Presto 无法读取十六进制字符串:不是有效的 base-16 数字