Qtcreater画图以及坐标问题

需要绘制正六边形铺满整个窗口,然后通过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 方法时,我们需要使用正确的规则。