Почему Qt.AlignCenter onQLabel отличается для изображения и текста в PyQt5? - PullRequest
1 голос
/ 19 января 2020

Я новичок в python и в настоящее время делаю некоторые базовые c упражнения. Я пытаюсь переписать какое-то приложение, в котором я использовал tkinter, чтобы сделать то же самое с PyQt5. Все работает отдельно от одной проблемы - у меня есть QLabel, содержащий изображение, и я пытаюсь выровнять изображение по центру метки, но это не нужно, изображение остается выровненным по левому краю. На это ответил @ eyllanes c, который предположил, что 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_()

1 Ответ

2 голосов
/ 19 января 2020

Во-первых, следует понимать, что это означает label.setAlignment(Qt.AlignCenter), этот код указывает, что элемент, который отображается (QPixmap или текст) в QLabel, будет в центре 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 (текст или изображение) было центрировано по отношению к окну, это также должно быть центрировано.


Например, другие решения:

  • Не устанавливайте фиксированный размер для ширины, а только для высоты.
  • es tabli sh, что ширина среднего QLabel равна 500.
...