想问下,怎么用pyqt5写出下图这样的效果,鼠标的这个十字只在每个网格的交界处移动。
我现在的网格背景已经写好了,用的QGraphicsScene和QGraphicsView,鼠标的十字形状是通过setCursor实现的,现在就想知道怎么样才能按照这个网格移动。
根据鼠标坐标除以格子宽度四舍五入,得到最近的x y坐标,将对应的两条线高亮,将之前的线恢复非高亮。
您可以使用PyQt5中的QPainter和QWidget类来实现这个效果。具体的实现方法如下:
首先创建一个QWidget对象,并将其设置为主窗口。
使用QPainter类在QWidget上绘制网格,可以通过调用QPainter的drawLine()方法来绘制水平和垂直线条。
创建一个鼠标事件处理函数,用来处理鼠标在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类,实现了一个简单的网格绘制和鼠标移动事件处理。您可以根据您的需求进行修改和扩展。
重写主窗口的closeEvent()
函数:
def closeEvent(self, event):
"""
主窗口关闭后,令子窗口也关闭
对主窗口的函数closeEvent进行重构
- 退出软件时结束所有进程
:param event:
:return:
"""
try:
self.is_MainWindow_running = False
reply = QMessageBox.question(self,
'本程序',
'是否要退出本程序',
QMessageBox.Yes | QMessageBox.No,
QMessageBox.No
)
if reply == QMessageBox.Yes:
event.accept()
os._exit(0) # 关闭所有进程和线程
else:
event.ignore()
except Exception as e:
print(e)
pass