我正在努力将一个
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())
正如您所看到的,即使文本应该放置在单元的中心,但它在水平轴和垂直轴上都有点偏离。
正如 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))