Почему метка отображается не полностью? - PullRequest
0 голосов
/ 21 апреля 2020

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

Отображение после запуска кода:

enter image description here

Код:

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 Ответ

2 голосов
/ 21 апреля 2020

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)

    # ...
...