Python 为什么PyQt5中的图像和文本Qt.AlignCenter onQLabel不同?

Python 为什么PyQt5中的图像和文本Qt.AlignCenter onQLabel不同?,python,pyqt,pyqt5,qlabel,Python,Pyqt,Pyqt5,Qlabel,我是python新手,目前正在做一些基本的改进。我正在尝试重写一些应用程序,其中我使用tkinter对PyQt5执行相同的操作。除了一个问题之外,一切都正常工作——我有一个包含QLabel的图像,我试图将图像对齐到标签的中心,但它不想,图像保持向左对齐。 @eyllanesc回答了这一问题,他建议QLabel相对于窗口不居中,我应该通过更改为以下方式居中小部件: layout.addWidget(label_img, alignment=Qt.AlignCenter) 这很好地工作了,但是在同

我是python新手,目前正在做一些基本的改进。我正在尝试重写一些应用程序,其中我使用tkinter对PyQt5执行相同的操作。除了一个问题之外,一切都正常工作——我有一个包含QLabel的图像,我试图将图像对齐到标签的中心,但它不想,图像保持向左对齐。 @eyllanesc回答了这一问题,他建议QLabel相对于窗口不居中,我应该通过更改为以下方式居中小部件:

layout.addWidget(label_img, alignment=Qt.AlignCenter)
这很好地工作了,但是在同一个布局中还有两个小部件(标签顶部,标签底部),标签上有文本。尽管没有与窗口中心对齐,但文本显示居中。为什么带有文本的标签与带有图像的标签行为不同

代码如下:

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的行为是占用可能的整个空间,如以下代码所示:

从PyQt5.qtwidts导入QApplication、QLabel、QWidget、QVBoxLayout
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
app=QApplication([])
window=QWidget()
窗口。设置固定大小(500500)
label_top=QLabel()
标签_top.setStyleSheet(“背景色:红色;”)
label_img=QLabel()
标签尺寸设置固定尺寸(300300)
标签\图像设置样式表(“背景色:绿色;”)
label_bottom=QLabel()
标签_bottom.setStyleSheet(“背景色:蓝色;”)
布局=QVBoxLayout(窗口)
layout.addWidget(标签\顶部)
layout.addWidget(标签\u img)
layout.addWidget(标签\底部)
window.show()
app.exec()

因此,在不像第一个和第三个一样具有固定大小的QLabel中,相对于窗口的对齐与第二个不同,因为如果希望QLabel的内容(文本或图像)相对于窗口居中,它也必须居中


例如,其他解决方案包括:

  • 不要将固定尺寸设置为宽度,而仅设置为高度
  • 确定中间QLabel的宽度为500

不要放置“相关片段”,而是放置一个。上面的代码是可复制的示例,它与您建议的更改一起工作,并将另外两个标签添加到布局中。问题是为什么标签img需要您的更改,而标签顶部/标签底部不需要居中。图像只是随机的png或jpg,对于我用QFileDialog.getOpenFileName选择的任何图像,结果都是一样的。我想你没有理解我,你是否添加了第二个我不知道放在哪里的代码片段?好吧,我不想推断它,但要明确,所以用一个可复制的代码片段替换你的第二个代码片段。对不起,是的-我误解了。希望现在一切都清楚了,值得回答吗?谢谢,我明白了!所以,如果我将label_img设置为固定宽度500(就像整个窗口),它的内容(图像)将水平显示在中心,对吗?