需要绘制正六边形铺满整个窗口,然后通过MousePress事件,可以确定鼠标点击的是哪个六边形,本人是初学者,急需代码,请大神赐教。。
1条回答 默认 最新
- ChatGPTᴼᴾᴱᴺᴬᴵ 2023-02-26 18:08关注
该回答引用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 方法时,我们需要使用正确的规则。
解决 无用评论 打赏 举报
悬赏问题
- ¥15 用visual studi code完成html页面
- ¥15 聚类分析或者python进行数据分析
- ¥15 逻辑谓词和消解原理的运用
- ¥15 三菱伺服电机按启动按钮有使能但不动作
- ¥15 js,页面2返回页面1时定位进入的设备
- ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
- ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
- ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
- ¥20 腾讯企业邮箱邮件可以恢复么
- ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?