Как центрировать текст, добавляемый в QPixmap?
Я добавляю текст на QPixmap по заданным координатам вот так:
...
ypos, xpos = 41, 23
pos = QPoint(xpos, ypos)
painter.drawText(pos, 'T')
и получаю такой результат:
Это для демонстрации того, что я хочу получить на выходе, только в данном случае координаты заданные, а как можно центрировать текст в QPixmap, при условии, что его размер заданный, например 64x64?
main.py:
import sys
from PyQt5.QtCore import QPoint, Qt
from PyQt5.QtGui import QPainter, QPen, QFont, QColor, QPixmap
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QLabel
class Window(QWidget):
def __init__(self):
super().__init__()
self.pixmap = QPixmap(64, 64)
self.pixmap.fill(QColor('black'))
painter = QPainter(self.pixmap)
pen = QPen(Qt.white)
painter.setPen(pen)
font = QFont()
font.setPointSize(20)
painter.setFont(font)
ypos, xpos = 41, 23
pos = QPoint(xpos, ypos)
painter.drawText(pos, 'T')
painter.setPen(QColor('white'))
painter.end()
self.layout = QVBoxLayout()
self.label = QLabel()
self.label.setPixmap(self.pixmap)
self.layout.addWidget(self.label)
self.setLayout(self.layout)
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
w = Window()
sys.exit(app.exec_())
В коде используется вывод в QLabel для демонстрации результата, но QPixmap будет использоваться и в других виджетах, также вместо заливки QPixmap может быть картинка, но я думаю это не должно повлиять на решение.
Ответы (2 шт):
Всегда начинаем с чтения документации и замечаем что одна из перегруженных QPainter::drawText может принимать на вход прямоугольник QRect и флаги (нам интересен Qt::AlignCenter)
def __init__(self):
super().__init__()
self.pixmap = QPixmap(random.uniform(100, 200), random.uniform(100, 200))
self.pixmap.fill(QColor('black'))
painter = QPainter(self.pixmap)
pen = QPen(Qt.white)
painter.setPen(pen)
font = QFont()
font.setPointSize(20)
painter.setFont(font)
painter.drawText(self.pixmap.rect(), Qt.AlignCenter, 'test')
painter.setPen(QColor('white'))
painter.end()
self.layout = QVBoxLayout()
self.label = QLabel()
self.label.setPixmap(self.pixmap)
self.layout.addWidget(self.label)
self.setLayout(self.layout)
self.show()
Как вариант:
import sys
import random
from PyQt5.Qt import *
class MainWindow(QWidget):
def __init__(self):
super().__init__()
self.pixmap = QPixmap(random.uniform(100, 200), random.uniform(100, 200))
self.pixmap.fill(QColor('black'))
painter = QPainter(self.pixmap)
pen = QPen(Qt.white)
painter.setPen(pen)
font = QFont()
font.setPointSize(20)
painter.setFont(font)
painter.drawText(self.pixmap.rect(), Qt.AlignCenter, 'test')
painter.setPen(QColor('white'))
painter.end()
self.label = QLabel()
self.label.setPixmap(self.pixmap)
# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
self.label_2 = QLabel('test', alignment=Qt.AlignCenter)
self.label_2.setObjectName("label_2")
self.label_2.setMinimumSize(200, 200)
self.label_2.setStyleSheet("""
#label_2 {
background-color: rgb(146, 43, 63);
color: #FBFFE2;
font-size: 20pt;
}
""")
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
self.pushButton = QPushButton('Click me')
self.pushButton.clicked.connect(self.button_clicked)
self.layout = QVBoxLayout(self)
self.layout.addWidget(self.label)
self.layout.addWidget(self.label_2)
self.layout.addWidget(self.pushButton)
def button_clicked(self):
text = self.label_2.text()
self.label_2.setText('Hello World' if text=='test' else 'test')
if __name__ == "__main__":
import sys
app = QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec())


