#c #qt #qgraphicsscene #qgraphicsitem #qgraphicstextitem
#c #qt #qgraphicsscene #qgraphicsitem #qgraphicstextitem
Вопрос:
Извините за мой английский, это не мой родной язык.
У меня проблема — мне нужно центрировать текст в моем QGraphicsSimpleTextItem. Я унаследовал свой класс от QGraphicsSimpleTextItem. Нужно ли переопределять paint()
метод или что мне делать?
Я читал о tightBoundingRect()
в QFontMetrics
. Могу ли я установить положение жесткой ограничивающей прямой в QGraphicsSimpleTextItem?
Спасибо за вашу помощь!
Ответ №1:
Может быть, что-то подобное может сработать.
void MySimpleTextItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) {
QFont numberFont = QFont("Helvetica [Cronyx]", 20);
painter->setFont(numberFont);
painter->drawText(boundingRect(), Qt::AlignCenter, QString::number(itemIndex));
}
В моем случае этот фрагмент кода должен был нарисовать число внутри QGraphicsEllipseItem с центром внутри эллипса. Я немного изменил свой код, чтобы он соответствовал вашему случаю, но важным моментом здесь является painter->drawText(boundingRect(), Qt::AlignCenter, QString::number(itemIndex));
то, что вы используете boundingRect() вместе с флагом Qt::AlignCenter .
Ответ №2:
QGraphicsSimpleTextItem
достаточно большой, чтобы вместить текст, поэтому выравнивание текста внутри элемента не имеет смысла.
То, что вы могли бы сделать, это расположить весь элемент относительно других элементов. Вам не нужно создавать подклассы QGraphicsSimpleTextItem
. Вместо этого используйте QGraphicsItem::setPos
для этого. В результате текст будет выглядеть выровненным каким-то образом, например, по центру.
Комментарии:
1. @kristian307, не могли бы вы ответить?
Ответ №3:
Для тех, кто пытается сделать это для PyQt5, это простой способ центрировать текст и установить событие наведения. Надеюсь, это поможет.
class SimpleText(QtWidgets.QGraphicsSimpleTextItem):
def __init__(self, parent=None):
super(SimpleText, self).__init__(parent)
self.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable, True)
self.setFlag(QtWidgets.QGraphicsItem.ItemIsSelectable, True)
self.setAcceptHoverEvents(True)
self.font_family = 'Arial'
self.font_size = 2.1
def hoverLeaveEvent(self, event):
self.setBrush(QtGui.QColor("black"))
def mousePressEvent(self, event):
self.setBrush(QtGui.QColor("gray"))
def paint(self, painter: QtGui.QPainter, option: 'QStyleOptionGraphicsItem', widget: QtWidgets.QWidget) -> None:
custom_font = QtGui.QFont(self.font_family)
custom_font.setPointSizeF(self.font_size)
painter.setFont(custom_font)
painter.drawText(self.boundingRect(), QtCore.Qt.AlignCenter, self.text())