gpt4 book ai didi

python - 如何在 QGraphicsScene 中定位和锚定文本?

转载 作者:行者123 更新时间:2023-12-04 09:36:10 29 4
gpt4 key购买 nike

所以我有这个小代码片段:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys

from PyQt5 import (QtWidgets as qtw, QtCore as qtc, QtGui as qtg)
import qdarkstyle
style = qdarkstyle.load_stylesheet_pyqt5()

class Scene(qtw.QGraphicsScene):
"""
contains data
"""

gridSize = (10, 10)
rectSize = 30

def __init__(self, parent, ):

super(Scene, self).__init__(parent)
self.setSceneRect(0, 0, 600, 400)
self.createGrid(*self.gridSize)

def createGrid(self, height, width):
rectSize = self.rectSize

self.fields = [
[self.addRect(
rectSize*(1+x), rectSize*(1+y), rectSize, rectSize)
for x in range(width)]
for y in range(height)]

self.column_ids = [
self.addText(letter) for letter in
[chr(65 + i) for i in range(self.gridSize[1])]]
[x.setPos(rectSize*(1.5 + i), rectSize*.5)
for i, x in enumerate(self.column_ids)]

self.row_ids = [
self.addText(letter) for letter in
[str(i) for i in range(1, self.gridSize[0])]]
[x.setPos(rectSize*.5, rectSize*(1.5+i))
for i, x in enumerate(self.row_ids)]


class View(qtw.QGraphicsView):
"""
displays data
"""

def __init__(self, parent=None, scene=None):

super(View, self).__init__(parent)

self.setScene(Scene(self))
self.setMouseTracking(True)


if __name__ == '__main__':
app = qtw.QApplication(sys.argv)
app.setStyleSheet(style)
widget = qtw.QWidget()
playerView = View(widget)
widget.setGeometry(300, 300, 400, 300)
widget.show()

sys.exit(app.exec_())

它创建一个 QGraphicScene,添加一些矩形,使它们形成一个网格,然后写入一些文本来标识网格的行和列。
当我设置 row_id 和 column_id 的位置时,它似乎是文本边界框左上角的位置。
我想要的是文本框的中心与网格的行/列中的矩形的中心对齐。
即结果应该是这样的:
___|_A_|_B_|_C_|_D_|_E_|___
| | | | | |
1 | | | | | |
___|___|___|___|___|___|___
| | | | | |
2 | | | | | |
___|___|___|___|___|___|___
但我现在得到的更像是这样的:
___|__A|__B|__C|__D|__E|___
| | | | | |
| | | | | |
__1|___|___|___|___|___|___
| | | | | |
| | | | | |
__3|___|___|___|___|___|___
我搜索了 QGraphicsScene.addText 和 QTextItem 的文档,以找到一种方法将 setPos 方法的 anchor 设置为 center 或类似的东西,但找不到任何东西。
我可能只需获取文本项的边界框的大小并减去一半的位置即可获得正确的结果,但这似乎是一种技巧,我更愿意直接定位文本项的中心。

最佳答案

通过减去中心来设置文本项的位置并不是一种技巧,它是唯一(或至少是最简单的)解决方案。
如文档所示,该项目始终使用为左上角设置的坐标定位,因为它适用于所有 QGraphicsItems(实际上是所有 QWidgets)。
text item coordinate system
因此,定位它们的正确方法是从要放置项目的位置中减去 boundingRect 中心。我建议您避免像您所做的那样使用列表推导:没有性能优势,而且它会降低您的代码的可读性。

    self.column_ids = []
for i in range(self.gridSize[1]):
letter = chr(65 + i)
pos = qtc.QPointF(rectSize * (1.5 + i), rectSize * .5)
item = self.addText(letter)
item.setPos(pos - item.boundingRect().center())
self.column_ids.append(item)

self.row_ids = []
for i in range(self.gridSize[0]):
pos = qtc.QPointF(rectSize * .5, rectSize * (1.5 + i))
item = self.addText(str(i + 1))
item.setPos(pos - item.boundingRect().center())
self.row_ids.append(item)
考虑您还可以创建 QGraphicsTextItem 的子类并覆盖它的 setPos方法或(更好)创建自己的居中方法。
class CenteredTextItem(qtw.QGraphicsTextItem):
def centerAt(self, pos):
self.setPos(pos - self.boundingRect().center())

class Scene(qtw.QGraphicsScene):
def createGrid(self, height, width):
# ...
for i in range(self.gridSize[1]):
letter = chr(65 + i)
pos = qtc.QPointF(rectSize * (1.5 + i), rectSize * .5)
item = CenteredTextItem(letter)
self.addItem(item)
item.centerAt(pos)
self.column_ids.append(item)

self.row_ids = []
for i in range(self.gridSize[0]):
pos = qtc.QPointF(rectSize * .5, rectSize * (1.5 + i))
item = CenteredTextItem(str(i + 1))
self.addItem(item)
item.centerAt(pos)
self.row_ids.append(item)

关于python - 如何在 QGraphicsScene 中定位和锚定文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62577372/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com