Почему метка отображается не полностью?

#python #pyqt #pyqt5

Вопрос:

Я учусь использовать PyQt5, и я столкнулся с проблемой, когда «моя первая метка» не отображается на моем экране полностью.

Отображение после выполнения кода:

введите описание изображения здесь

Код:

 from PyQt5 import QtWidgets, QtCore, QtGui
from PyQt5.QtCore import *
from PyQt5.QtGui  import *
from PyQt5.QtWidgets import QApplication, QMainWindow
import sys

QtWidgets.QApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling, True) #enable highdpi scaling
QtWidgets.QApplication.setAttribute(QtCore.Qt.AA_UseHighDpiPixmaps, True) #use highdpi icons

def window():
  app = QApplication(sys.argv)
  win = QMainWindow()
  win = QMainWindow()
  win.setGeometry(200, 200, 400, 400)
  win.setWindowTitle("Tech with Aeijan")
  label = QtWidgets.QLabel(win)
  label.setText("my first label!")
  label.move(50,50)

  win.show()
  sys.exit(app.exec_())

window()
 

Комментарии:

1. Попробуйте добавить label.adjust() перед label.move(50,50) строкой…

Ответ №1:

QLabel адаптирует свое содержимое на основе (возможного) родительского менеджера макетов, но вы его не использовали, поэтому он не знает, как правильно отображать себя или адаптировать свой размер для этого.

Самым простым решением является вызов label.adjustSize() , который приведет к изменению размера метки таким образом, чтобы она могла отображать свое содержимое.

Однако это было бы не очень хорошей идеей: вы пытаетесь использовать фиксированное положение для виджета (что обычно считается плохим решением по множеству причин); результатом будет то, что если текст метки слишком большой и пользователь изменит размер окна, текст не будет полностью виден, как это должно быть, и метка не будет знать, как изменить размер или в конечном итоге обернуть его содержимое, чтобы убедиться, что весь его текст отображается.

Лучший подход-использовать менеджер макетов, но это решение предназначено для более простых виджетов (например, QWidget или QDialog); QMainWindow так не работает, и для этого требуется установить центральный виджет, чтобы обеспечить правильное отображение и управление его содержимым.

В вашем случае вы могли бы просто использовать self.setCentralWidget(label) , но это помешало бы вам добавить какой-либо другой виджет в свое окно.

Вместо этого следует использовать виджет «контейнер», и этот виджет будет установлен в качестве центрального для главного окна; затем вы можете задать макет для этого виджета и добавить к нему метку:

 def window():
    app = QApplication(sys.argv)
    win = QMainWindow()

    central = QWidget()
    win.setCentralWidget(central)

    layout = QVBoxLayout()
    central.setLayout(layout)
    # alternatively, the above is the same as this:
    # layout = QVBoxLayout(central)

    label = QtWidgets.QLabel(win)
    label.setText("my first label!")
    layout.addWidget(label)

    # ...
 

Комментарии:

1. Я получил сообщение об ошибке, в котором говорится, что «QWidget» не определен. Я подумал, что это опечатка, поэтому попробовал «QWidgets» и получил ту же ошибку.

2. QWidget является частью PyQt5.QtWidgets базового класса и базовым классом для всех виджетов , используемых Qt. Будьте более осторожны, чтобы не смешивать импортные «стили». Вы должны либо использовать from PyQt5 import QtWidgets, ... , либо импортировать отдельные классы, как вы делали с from PyQt5.QtWidgets import QApplication, QMainWindow ними, но с последними вам придется вручную добавлять каждый класс в инструкции импорта каждый раз, когда вам понадобится один, который вы еще не указали.

3. Это работает! Теперь весь лейбл показывает! Огромное спасибо.