落臻123 2014-01-15 08:50 采纳率: 0%
浏览 1077

Qtcreater画图以及坐标问题

需要绘制正六边形铺满整个窗口,然后通过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上使用吗?