为什么Qt.AlignCenter on QLabel在PyQt5中的图像和文本不同?

问题描述 投票:0回答:1

我是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_()
python pyqt pyqt5 qlabel
1个回答
1
投票

[首先,必须理解它的意思是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_()

enter image description here

因此,在QLabel中没有像第一个和第三个那样固定大小的情况,相对于第二个窗口,与窗口的对齐是无关紧要的,因为如果您希望QLabel的内容(文本或图像)相对于该窗口也必须居中。


例如,其他解决方案是:

  • 不对宽度设置固定大小,而仅对高度设置固定大小。
  • 确定中间QLabel的宽度为500。
© www.soinside.com 2019 - 2024. All rights reserved.