Как динамически переместить ряд кнопок на его линии - PullRequest
0 голосов
/ 22 февраля 2020

Я пытаюсь создать игру, в которой ряд кнопок можно перемещать по бокам при нажатии кнопки.

Я пока использую растяжку в макете и могу поместить его в различные состояния, которые я хочу это должно быть, но не динамически. Данные обновляются, когда я нажимаю кнопку sh, но использование update () или repaint () не работает вообще (я могу использовать их неправильно).

decal = [0,0,0,0]    #values between -3 and +3, one for each row

class grid(QWidget):
    """
    creates the grid layout by aligning a set of rows
    """
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        layout = QVBoxLayout()
        layout.addStretch()
        layout.setSpacing(0)
        for i in range(4):
            layout.addItem(row(i))
        layout.addStretch()
        self.setLayout(layout)


class row(QHBoxLayout):
    def __init__(self, ligne):
        super().__init__()
        self.ligne = ligne
        self.initUI()

    def initUI(self):
        # ajout des widgets et stretch
        self.addWidget(rangmoins(self.ligne))
        self.addStretch(3 + decal[self.ligne])
        for i in range(4):
            self.addWidget(gridbutton(self.ligne, i))
        self.addStretch(3 - decal[self.ligne]) # I modify the decal value to move the row and the size of the stretch
        self.addWidget(rangplus(self.ligne))
        self.setSpacing(0)


class rangplus(QPushButton):
    """
    modifies the values of decal to change the stretchitems size
    """
    def __init__(self, ligne):
        super().__init__()
        self.side = 52
        self.clicked.connect(self.on_click)
        self.ligne = ligne
        self.initUI()

    def initUI(self):
        self.setFixedSize(self.side, self.side)
        self.setText(">")

    def on_click(self):
        global joueur
        if decal[self.ligne] != 3:
            joueur = joueur % 2 + 1
            decal[self.ligne] += 1
            window.repaint() # need to update the window so it displays the change
        else:
            print("coup impossible")

1 Ответ

0 голосов
/ 23 февраля 2020

Трудно дать ответ с учетом вашего кода, потому что не все переменные определены в предоставленном вами фрагменте. Но вот общий способ добиться этого с помощью QGridLayout. Что вы делаете, это удалите каждую кнопку в строке, замените ее на QSpacerItem и вставьте кнопку в новый столбец на другой стороне. Попробуйте запустить этот пример и посмотрите, сможете ли вы адаптировать его под свой код:

class Template(QWidget):

    def __init__(self):
        super().__init__()
        self.grid = QGridLayout(self)
        self.grid.setHorizontalSpacing(0)
        for row in range(4):
            for col in range(4):
                self.grid.addWidget(QPushButton(str(row)), row, col)

        for i in range(4):
            btn = QPushButton('>')
            btn.clicked.connect(self.move_buttons)
            self.grid.addWidget(btn, i, 4)

    def move_buttons(self):
        row = self.grid.getItemPosition(self.grid.indexOf(self.sender()))[0]
        for col in range(4):
            btn = self.grid.itemAtPosition(row, col).widget()
            self.grid.removeWidget(btn)
            self.grid.addWidget(btn, row, col + 5)
            self.grid.addItem(QSpacerItem(btn.width(), btn.height(), QSizePolicy.Maximum, QSizePolicy.Maximum), row, col)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...