落臻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 方法时,我们需要使用正确的规则。

    评论

报告相同问题?

悬赏问题

  • ¥20 关于#qt#的问题:Qt代码的移植问题
  • ¥50 求图像处理的matlab方案
  • ¥50 winform中使用edge的Kiosk模式
  • ¥15 关于#python#的问题:功能监听网页
  • ¥15 怎么让wx群机器人发送音乐
  • ¥15 fesafe材料库问题
  • ¥35 beats蓝牙耳机怎么查看日志
  • ¥15 Fluent齿轮搅油
  • ¥15 八爪鱼爬数据为什么自己停了
  • ¥15 交替优化波束形成和ris反射角使保密速率最大化