为什么 Qt.AlignCenter onQLabel 对于 PyQt5 中的图像和文本不同?
Why does Qt.AlignCenter onQLabel differ for image and text in PyQt5?
我是 python 的新手,目前正在做一些基础练习。我正在尝试重写一些我在其中使用 tkinter 对 PyQt5 执行相同操作的应用程序。除了一个问题外,一切正常——我有一个包含图像的 QLabel,我试图将图像对齐到标签的中心,但它不想这样做,图像保持向左对齐。
@eyllanesc 回答了这个问题,他建议 QLabel 不以 window 为中心,我应该通过更改为:
来使小部件居中
layout.addWidget(label_img, alignment=Qt.AlignCenter)
而且效果很好,但是在同一布局中还有两个小部件(label_top、label_bottom),尽管未与 text.And 的中心对齐,但标签带有 text.And =23=], 文字居中显示。为什么带有文本的标签与带有图像的标签的行为不同?
代码如下:
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或text)会在QLabel的中心,而不是居中window.
在示例中,差异由标签的大小给出,因为第一个和第三个标签没有固定大小,不像第二个标签大小为 300x500,因此没有固定大小的 QLabel 的行为是占据整个space可能如下代码所示:
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 中,与 window 的对齐与第二个不同,因为如果你想要 QLabel 的内容(文本或图像) ) 相对于 window 居中它也必须居中。
例如其他解法有:
- 不要为宽度设置固定尺寸,而要为高度设置固定尺寸。
- 确定中间QLabel的宽度为500
我是 python 的新手,目前正在做一些基础练习。我正在尝试重写一些我在其中使用 tkinter 对 PyQt5 执行相同操作的应用程序。除了一个问题外,一切正常——我有一个包含图像的 QLabel,我试图将图像对齐到标签的中心,但它不想这样做,图像保持向左对齐。 @eyllanesc 回答了这个问题,他建议 QLabel 不以 window 为中心,我应该通过更改为:
来使小部件居中layout.addWidget(label_img, alignment=Qt.AlignCenter)
而且效果很好,但是在同一布局中还有两个小部件(label_top、label_bottom),尽管未与 text.And 的中心对齐,但标签带有 text.And =23=], 文字居中显示。为什么带有文本的标签与带有图像的标签的行为不同?
代码如下:
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或text)会在QLabel的中心,而不是居中window.
在示例中,差异由标签的大小给出,因为第一个和第三个标签没有固定大小,不像第二个标签大小为 300x500,因此没有固定大小的 QLabel 的行为是占据整个space可能如下代码所示:
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 中,与 window 的对齐与第二个不同,因为如果你想要 QLabel 的内容(文本或图像) ) 相对于 window 居中它也必须居中。
例如其他解法有:
- 不要为宽度设置固定尺寸,而要为高度设置固定尺寸。
- 确定中间QLabel的宽度为500