Изменение размера 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 шт):
Вам надо поместить 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_())




