Как я могу преобразовать координаты сетки обратно в (x, y)? - PullRequest
0 голосов
/ 30 апреля 2018

Я создаю игру в PyQt5, где пользователь может щелкнуть внутри сетки, чтобы сформировать квадраты. Если пользователь выбирает четыре пространства сетки, которые образуют квадрат, углы соединяются линиями. Мой код в настоящее время выглядит так:

import sys
from PyQt5.QtGui import QPainter, QColo, QPen, QBrush
from PyQt5.QtCore import Qt, QRect, QPoint
from PyQt5.QtWidgets import QWidget, QApplication

CELL_COUNT = 8
CELL_SIZE = 50
GRID_ORIGINX = 150
GRID_ORIGINY = 150
W_WIDTH = 700
W_HEIGHT = 700

class TribeSquares(QWidget):

def __init__(self):
    super().__init__()
    self.setGeometry(300, 300, W_WIDTH, W_HEIGHT)
    a = ''
    self.__board = [[a,a,a,a,a,a,a,a],[a,a,a,a,a,a,a,a],[a,a,a,a,a,a,a,a],[a,a,a,a,a,a,a,a],[a,a,a,a,a,a,a,a],[a,a,a,a,a,a,a,a],[a,a,a,a,a,a,a,a],[a,a,a,a,a,a,a,a]]
    self.__row = None
    self.__col = None
    self.__clicked0 = []
    self.show()

Сначала я преобразовал (x, y) координаты в координаты сетки.

def mousePressEvent(self, event):
    self.__x = event.x()
    self.__y = event.y()
    self.__row = (event.y() - GRID_ORIGINY) // CELL_SIZE
    self.__col = (event.x() - GRID_ORIGINX) // CELL_SIZE
    row = self.__row
    col = self.__col
    self.update()

Для другого метода я хочу преобразовать (row, col) обратно в (x, y). Я попытался полностью изменить процесс и сделать это так:

def cell2coord(self, row, col):
    return ((row * CELL_SIZE) + GRID_ORIGINX, (col * CELL_SIZE) + GRID_ORIGINY)

Далее в paintEvent я пытаюсь вызвать созданный мною метод.

def paintEvent(self, event):
    qp = QPainter()
    qp.begin(self)
    for r in range(CELL_COUNT):
        for c in range(CELL_COUNT):
            qp.setPen(QPen(Qt.black, 1))
            qp.drawRect(CELL_SIZE * c + GRID_ORIGINX, CELL_SIZE * r + GRID_ORIGINY, CELL_SIZE, CELL_SIZE)
            if (r, c) in self.__clicked0:
                qp.setPen(QPen(QColor(40, 85, 66), 1))
                qp.setBrush(QColor(40, 85, 66))
                qp.drawRect(CELL_SIZE * c + GRID_ORIGINX + 7.5, CELL_SIZE * r + GRID_ORIGINY + 7.5, 35, 35)
                qp.setBrush(QColor(237, 237, 237))
            elif (r, c) in self.__clicked1:
                qp.setPen(QPen(QColor(231, 181, 71), 1))
                qp.setBrush(QColor(231, 181, 71))
                qp.drawRect(CELL_SIZE * c + GRID_ORIGINX + 7.5, CELL_SIZE * r + GRID_ORIGINY + 7.5, 35, 35)
                qp.setBrush(QColor(237, 237, 237))
    for (r, c) in self.__clicked0:
        x,y = self.cell2coord(r,c)
        x2,y2 = self.cell2coord(self.__row, self.__col)
        if r == self.__row or c == self.__col:
            qp.setPen(QPen(QColor(40, 85, 66), 5))
            qp.drawLine(x, y, x2, y2)
    for (r, c) in self.__clicked1:
        if r == self.__row or c == self.__col:
            qp.setPen(QPen(QColor(231, 181, 71), 5))
            qp.drawLine(x, y, x2, y2)
    qp.end()

if __name__ == '__main__':
  app = QApplication(sys.argv)
  ex = TribeSquares()
  sys.exit(app.exec_())

Но это не сработало. Линии не отображаются в нужном месте и соединяют квадраты, созданные щелчками пользователя в сетке. Что я могу сделать?

1 Ответ

0 голосов
/ 30 апреля 2018

Так же, как вы построили прямоугольники для рисования в методе paintEvent, вы можете сделать это, чтобы получить QRect, а затем использовать его метод center(), а затем получить его координаты.

def cell2coord(self, row, col):
    center_pos = QRect(CELL_SIZE * c + GRID_ORIGINX, CELL_SIZE * r + GRID_ORIGINY, CELL_SIZE, CELL_SIZE).center()
    return center_pos.x(), center_pos.y()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...