在PyQt6中绘制网格

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

我正在尝试在 QGraphicsScene 中绘制网格。更具体地说,我想要一个由 32x32 像素单元组成的 256 x 256 网格,其中单元在所有侧面(包括整个网格的边界)均由 1 像素厚的边框分隔。所以整个场景的宽度和高度应该是(256*32 + 257)= 8449 像素。我尝试通过使用 QGraphicsLineItem 绘制线条来做到这一点。然后我打开屏幕截图并测量我的单元格,发现它们的宽度/高度在 40 到 41 像素之间(有些甚至不是正方形)。我认为问题一定与这里涉及的不同坐标系(项目、场景和视图坐标)有关。我不太理解关于此的文档

最值得注意的是,文档说,在视图坐标中,左上角是(0, 0),而右下角是(view.width, view.height)。这怎么可能?这些坐标是 0 索引的,因此这将导致尺寸为 (view.width + 1) x (view.height + 1)。

这是我的尝试

from PyQt6.QtWidgets import QApplication, QGraphicsScene, QGraphicsView, QGraphicsLineItem, QMainWindow, QVBoxLayout, QFrame
from PyQt6.QtGui import QColor, QPen

app = QApplication([])

scene = QGraphicsScene(0, 0, 8448,8448)
scene.setBackgroundBrush(QColor(0, 255, 0))

for i in range(0, 8449, 33):
    pen = QPen(QColor(0, 0, 255))
    pen.setWidth(0)
    horizontal_line = QGraphicsLineItem(0, 0, 8448, 0)
    horizontal_line.setPen(pen)
    horizontal_line.setPos(0, i)
    scene.addItem(horizontal_line)
    horizontal_line.setOpacity(0.5)
    vertical_line = QGraphicsLineItem(0, 0, 0, 8448)
    vertical_line.setPen(pen)
    vertical_line.setPos(i, 0)
    vertical_line.setOpacity(0.5)
    scene.addItem(vertical_line)

window = QMainWindow()
window.show()

container = QFrame(parent=window)
vlayout = QVBoxLayout()

view = QGraphicsView(scene, parent=container)
vlayout.addWidget(view)

container.setLayout(vlayout)
window.setCentralWidget(container)

view.show()
app.exec()
python pyqt qgraphicsview qgraphicsscene
1个回答
0
投票

设置旗帜

os.environ["QT_ENABLE_HIGHDPI_SCALING"] = "0"

禁用高 DPI 缩放,允许您按照物理像素将项目放置在场景上。

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