需要绘制正六边形铺满整个窗口,然后通过MousePress事件,可以确定鼠标点击的是哪个六边形,本人是初学者,急需代码,请大神赐教。。
该回答引用ChatGPT
您可以使用 Qt Creator 中的 QPainter 类来绘制正六边形,并使用鼠标事件来确定哪个六边形被点击。
以下是一个简单的示例代码:
from PyQt5.QtGui import QPainter, QPolygon, QColor
from PyQt5.QtCore import Qt, QPoint
from PyQt5.QtWidgets import QMainWindow, QApplication
import sys
class Hexagon:
def __init__(self, x, y, size):
self.x = x
self.y = y
self.size = size
def draw(self, qp):
points = self.hexagon_points(self.x, self.y, self.size)
polygon = QPolygon(points)
qp.drawPolygon(polygon)
def hexagon_points(self, x, y, size):
points = []
for i in range(6):
angle_deg = 60 * i
angle_rad = math.pi / 180 * angle_deg
x_i = x + size * math.cos(angle_rad)
y_i = y + size * math.sin(angle_rad)
points.append(QPoint(x_i, y_i))
return points
class Example(QMainWindow):
def __init__(self):
super().__init__()
self.hexagons = []
self.initUI()
def initUI(self):
self.setGeometry(100, 100, 500, 500)
self.setWindowTitle('Hexagons')
self.show()
def paintEvent(self, e):
qp = QPainter()
qp.begin(self)
self.draw_hexagons(qp)
qp.end()
def draw_hexagons(self, qp):
size = 50
width = self.width()
height = self.height()
num_cols = int(width / (size * 1.5)) + 1
num_rows = int(height / (size * math.sqrt(3))) + 1
for i in range(num_rows):
offset = (i % 2) * size * 0.5
for j in range(num_cols):
x = j * size * 1.5 + offset
y = i * size * math.sqrt(3)
hexagon = Hexagon(x, y, size)
hexagon.draw(qp)
self.hexagons.append(hexagon)
def mousePressEvent(self, event):
for hexagon in self.hexagons:
if hexagon.hexagon_points(hexagon.x, hexagon.y, hexagon.size).containsPoint(event.pos(), Qt.OddEvenFill):
print("Hexagon clicked:", hexagon.x, hexagon.y)
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
在此示例中,我们首先定义了一个 Hexagon 类,该类用于绘制正六边形。然后,我们创建了一个 Example 类,该类继承自 QMainWindow,并且实现了 paintEvent 和 mousePressEvent 方法。在 paintEvent 方法中,我们使用 Hexagon 类来绘制所有的正六边形,并将它们保存在 hexagons 列表中。在 mousePressEvent 方法中,我们遍历 hexagons 列表,检查鼠标点击是否在某个正六边形内,如果是,则输出该正六边形的坐标。
在绘制正六边形时,我们使用了 Hexagon 类的 hexagon_points 方法来计算正六边形的顶点。该方法接受三个参数:正六边形的中心点坐标 x 和 y,以及正六边形的大小 size。该方法返回一个 QPolygon 对象,该对象包含六个顶点的坐标。
在 draw_hexagons 方法中,我们计算了窗口的大小以及可以容纳多少行和列的正六边形。然后,我们使用两个嵌套的循环来绘制所有的正六边形。对于每个正六边形,我们使用 Hexagon 类来绘制它,并将它添加到 hexagons 列表中。
在 mousePressEvent 方法中,我们遍历 hexagons 列表,并使用 containsPoint 方法来检查鼠标点击是否在正六边形内。如果鼠标点击在某个正六边形内,则输出该正六边形的中心点坐标。
请注意,在 containsPoint 方法中,我们使用了 Qt.OddEvenFill 参数,该参数表示我们要使用奇偶规则来填充正六边形。这是因为正六边形的形状可以通过奇偶规则来描述,而不是通过非零规则来描述。因此,在使用 containsPoint 方法时,我们需要使用正确的规则。