QGraphicsScene,在形状上居中文本

问题描述 投票:0回答:1

我正在努力将一个

QGraphicsTextItem
放在另一个
QGraphicsRectItem
的中心。我已经设置了 SceneRect,所以我相信所有内容都应该映射到 [0,0] (如其他帖子所建议的),但我不确定为什么尝试
setPos()
不会对齐矩形上的文本元素.

这是在所有元素上绘制边框的代码示例:

import sys
from PyQt6.QtCore import *
from PyQt6.QtGui import *
from PyQt6.QtWidgets import *

class MainWindow(QMainWindow):
    def __init__(self, *args, parent=None):
        super().__init__(*args, parent=parent)
        self.setWindowTitle("Timeline")
        self.resize(1000,500)

        self.toolbar=QToolBar()
        self.toolbar.addAction("New Event")
        self.addToolBar(self.toolbar)

        self.drawScene=QGraphicsScene()
        self.drawView=QGraphicsView()
        self.drawView.setScene(self.drawScene)
        self.setCentralWidget(self.drawView)

        self.drawScene.setSceneRect(0,0,self.window().width(),self.window().height())

        unit_len=200
        winH=self.window().height()
        winW=self.window().width()
        padX=30
        padY=30
        self.drawView.setAlignment(Qt.AlignmentFlag.AlignCenter)

        unitPen=QPen(Qt.GlobalColor.green)
        unitPen.setWidth(0)
        unitBrush=QBrush(Qt.GlobalColor.lightGray)

        units=[2001,2002,2003,2004,2005]
        dist=0
        for i in units:
            r=QRectF(QPointF(padX+dist,(winH/2)-20),QPointF(padX+dist+unit_len,(winH/2)+20))
            self.drawScene.addRect(r,unitPen, unitBrush)

            r=QLineF(QPointF(padX+dist,(winH/2)),QPointF(padX+dist+unit_len,(winH/2)))
            self.drawScene.addLine(r,QPen(Qt.GlobalColor.red))

            t=self.drawScene.addText(str(i))
            t.setPos(QPointF(padX+dist+(unit_len/2), (winH/2)-(t.boundingRect().height()/2)))
            t.setDefaultTextColor(Qt.GlobalColor.blue)
            t.setFont(QFont("Segoe UI",12,700))

            self.drawScene.addRect(t.sceneBoundingRect(),QPen(Qt.GlobalColor.red))
            dist+=unit_len
        self.drawScene.addRect(QRectF(QPointF(padX+dist,(winH/2)-20),QPointF(padX+dist+padX,(winH/2)+20)), QPen(Qt.GlobalColor.white), QBrush(Qt.GlobalColor.white))

app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec())

Misaligned Text

正如您所看到的,即使文本应该放置在单元的中心,但它在水平轴和垂直轴上都有点偏离。

python pyqt qgraphicsscene pyqt6
1个回答
0
投票

正如 musicamante 提到的,QGraphicsPathItem 可以作为未对齐的解决方案。

我用路径替换了文本绘制部分,该路径与

QFontMetrics.tightBoundingRect()
的边界框对齐。从那里开始,我只是对位置进行平均,它就正确居中了。我认为这在计算上更昂贵。

path = QPainterPath()
font=QFont("Segoe UI",12,500)
metrics=QFontMetrics(font)
textRect=metrics.tightBoundingRect(i)
path.addText(QPointF(padX+dist+(unit_len/2)-textRect.width()/2, (winH/2)+textRect.height()/2),font,i)
self.drawScene.addPath(path, QPen(Qt.GlobalColor.black), QBrush(Qt.GlobalColor.black))

© www.soinside.com 2019 - 2024. All rights reserved.