Изменение размера QWidget в зависимости от QLabel

Пытаюсь переписать код с Tk на PyQt5

В Tk изначально окно меняется до нужного размера в зависимости от текст, в то время как в PyQt5 размер каждого элемента установлен изначально фиксированный.

Идей как это исправить нет. В Интернете информации найти не получилось.

Tk:

class Window:
    def __init__(self):
        self.root = Tk()
        self.root.overrideredirect(True)
        self.root.wm_attributes("-topmost", True)
        self.root.wm_attributes("-alpha", 0.75)
        self.root.config(background='black')

        screen_width = self.root.winfo_screenwidth()
        root_width = self.root.winfo_width()

        center_with_offset = int((screen_width - root_width)/2)
        
        self.root.geometry('+'+str(center_with_offset)+'+0')

        self.label = Label(self.root, text="Test", font=("Consolas", 10))
        self.label.config(foreground='white')
        self.label.config(background='black')
        self.label.config(justify=LEFT)
        self.label.pack()

    def show(self):
        screen_width = self.root.winfo_screenwidth()
        root_width = self.root.winfo_width()

        center_with_offset = int((screen_width - root_width)/2)

        self.root.geometry('+'+str(center_with_offset)+'+0')
        self.root.update()

    def set_text(self, text):
        self.label.config(text = text)

PyQt5:

class QWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowFlags(QtCore.Qt.Window | QtCore.Qt.FramelessWindowHint | QtCore.Qt.WindowStaysOnTopHint)
        self.setWindowOpacity(0.75)
        self.setAttribute(QtCore.Qt.WA_StyledBackground, True)
        self.setStyleSheet('background-color: black; color: white')

        self.lbl1 = QLabel('Zetcode', self)
        self.lbl1.mouseReleaseEvent = self.print

        self.show()
    
    def print(self, *args):
        print(args)
        qApp.quit()

    def set_text(self, text):
        self.lbl1.setText(text)

Ответы (1 шт):

Автор решения: S. Nick

Вам надо поместить label в менеджер компоновки:

    ...
    layout = QVBoxLayout(self) 
    layout.addWidget(self.label, stretch=1)
    ...

Я также добавил lineEdit, чтобы можно было менять текст и наблюдать что происходит.

Обратите внимание на некоторые другие вещи, которые я добавил:

wordWrap : bool

Это свойство содержит политику переноса слов для label's.

maximumWidth : int

Это свойство содержит максимальную ширину виджета в пикселях.

void QLineEdit::editingFinished()

Этот сигнал излучается при нажатии клавиши Return или Enter или при потере фокуса при редактировании строки.

void QWidget::adjustSize()

Регулирует размер виджета, чтобы он соответствовал его содержимому.

Также я переопределил два метода mousePressEvent и mouseMoveEvent,
чтобы вы могли перетаскивать окно ЛКМ.


main.py

import sys
from PyQt5.Qt import *


class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowFlags(Qt.FramelessWindowHint | 
                            Qt.WindowStaysOnTopHint)
        self.setWindowOpacity(0.75)
        self.setAttribute(Qt.WA_StyledBackground, True)
        self.setStyleSheet('background-color: #2D2424;')  

        self.label = QLabel('Zetcode', self)
        self.label.setMaximumWidth(500)
        self.label.setWordWrap(True)                             # !!!
        self.label.setStyleSheet('''
            background-color: #5C3D2E; 
            color: #E0C097; 
            font-size: 25px;
        ''')

        self.lineEdit = QLineEdit('Hello<br>World')
        self.lineEdit.setMaximumWidth(50)                       # !!!
        self.lineEdit.setStyleSheet('background-color: #B85C38; color: white')
        self.lineEdit.editingFinished.connect(self.set_text)    # !!!
        
        layout = QVBoxLayout(self)                              # !!!
        layout.addWidget(self.label, stretch=1)
        layout.addWidget(self.lineEdit, stretch=0, alignment=Qt.AlignLeft)

    def set_text(self):  
        self.label.setText(self.lineEdit.text())
        self.adjustSize()                                       # !!!
        
    # +++ vvvvvvvvvvv для перетаскивания окна ЛКМ vvvvvvvvvvvvvvvvv
    def mousePressEvent(self, event):
        self.oldPos = event.globalPos()
            
    def mouseMoveEvent(self, event):
        if event.buttons() == Qt.LeftButton:
            delta = QPoint (event.globalPos() - self.oldPos)
            self.move(self.x() + delta.x(), self.y() + delta.y())
            self.oldPos = event.globalPos()
    # +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
       
 
if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = Window()
    w.show()
    sys.exit(app.exec_())

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


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


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


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



Update

Но всё же стоило сказать, что данное окно должно просто выводить информацию на экран и не более. Т.е. просто находиться в верху экрана без возможности как-либо меняться пользователем напрямую (максимум нажатие на дабы изменить вывод на следующий)

Тогда попробуйте так:

import sys                                                         
from PyQt5.Qt import *

class Label(QLabel):
    def __init__(self):
        super().__init__()

        self.setWindowFlags(Qt.WindowStaysOnTopHint | Qt.FramelessWindowHint)   
        self.setAttribute(Qt.WA_TranslucentBackground)
        self.setText("<b style='color: red;'>Hello World</b>")
        self.setFont(QFont("Times", 15)) 
        self.adjustSize()
        self.setGeometry(
            QStyle.alignedRect(
                Qt.LeftToRight,
                Qt.AlignHCenter | Qt.AlignTop,
                self.size(),
                QApplication.instance().desktop().availableGeometry()
            )
        )

    def mousePressEvent(self, event):
        if event.button() == Qt.LeftButton:
            qApp.quit()  


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = Label()
    w.show()
    sys.exit(app.exec_())

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

→ Ссылка