怎么用pyqt5写出下图这样的效果,鼠标的这个十字只在每个网格的交界处移动

想问下,怎么用pyqt5写出下图这样的效果,鼠标的这个十字只在每个网格的交界处移动。

img

我现在的网格背景已经写好了,用的QGraphicsScene和QGraphicsView,鼠标的十字形状是通过setCursor实现的,现在就想知道怎么样才能按照这个网格移动。

根据鼠标坐标除以格子宽度四舍五入,得到最近的x y坐标,将对应的两条线高亮,将之前的线恢复非高亮。

您可以使用PyQt5中的QPainter和QWidget类来实现这个效果。具体的实现方法如下:

  1. 首先创建一个QWidget对象,并将其设置为主窗口。

  2. 使用QPainter类在QWidget上绘制网格,可以通过调用QPainter的drawLine()方法来绘制水平和垂直线条。

  3. 创建一个鼠标事件处理函数,用来处理鼠标在QWidget上的移动事件。在该函数中,获取当前鼠标的位置,并计算出鼠标所在的网格的位置。然后使用QPainter类绘制十字线条,将其绘制在当前网格的交叉点上。

以下是一个示例代码,展示了如何在PyQt5中实现这个效果:

from PyQt5.QtWidgets import QWidget, QApplication
from PyQt5.QtGui import QPainter, QPen
from PyQt5.QtCore import Qt, QPoint

class Example(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()


    def initUI(self):

        self.setGeometry(300, 300, 350, 300)
        self.setWindowTitle('Example')
        self.show()


    def paintEvent(self, event):

        qp = QPainter()
        qp.begin(self)
        self.drawGrid(qp)
        qp.end()


    def drawGrid(self, qp):

        pen = QPen(Qt.black, 1, Qt.SolidLine)

        qp.setPen(pen)
        size = self.size()

        for i in range(0, size.width(), 50):
            qp.drawLine(i, 0, i, size.height())

        for i in range(0, size.height(), 50):
            qp.drawLine(0, i, size.width(), i)


    def mouseMoveEvent(self, event):

        x = event.x()
        y = event.y()

        # 计算当前鼠标所在的网格位置
        grid_x = (x // 50) * 50
        grid_y = (y // 50) * 50

        # 绘制十字线条
        qp = QPainter()
        qp.begin(self)
        pen = QPen(Qt.red, 2, Qt.SolidLine)
        qp.setPen(pen)
        qp.drawLine(grid_x, 0, grid_x, self.height())
        qp.drawLine(0, grid_y, self.width(), grid_y)
        qp.end()


if __name__ == '__main__':

    import sys

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

在这个示例代码中,我们使用了QWidget、QPainter、QPen和QPoint等PyQt5类,实现了一个简单的网格绘制和鼠标移动事件处理。您可以根据您的需求进行修改和扩展。