Переместить виджет pyqt в макет - PullRequest
0 голосов
/ 26 февраля 2019

Привет, у меня есть кнопки в моем коде. Мне бы хотелось, чтобы, когда пользователь нажимал кнопку вставки новой кнопки, она перемещала все остальные кнопки на одну строку ниже и создавала новую кнопку под той кнопкой, на которой она была нажата. Это мой код

Bascily Я пытаюсь переместить все кнопки в макете на один ряд ниже, и после того, как я добавляю новую кнопку:

def Insert_Stage(self) :
    button = self.sender()
    idx = self.Layout.indexOf(button)
    location = self.Layout.getItemPosition(idx)

    x=location[0]
    z=self.Layout.rowCount()
    print(x,z)
    while(z >x+1):

        items= self.Layout.itemAt(z)
        # setting the item as widget 
        widget=items.widget()
        index= self.Layout.indexOf(widget)
        loc=self.Layout.getItemPosition(index)

        d=loc[0]
        y=loc[1]
        if y!=0:
            #widget.move(d+100,d)
            self.Layout.addWidget(widget,(d+1),1)
        else:
         self.Layout.addWidget(widget,d+1,0)
        z-=1

    stage=QtGui.QPushButton(self)
    stage.setObjectName(button.objectName())
    k=(int(button.objectName()[5:])+1)
    stage.setText('stage%d'%k)
    self.Layout.addWidget(stage,(location[0]+1),0)

1 Ответ

0 голосов
/ 26 февраля 2019

Если вы используете QVBoxLayout, вы должны использовать метод insertWidget():

from PyQt4 import QtCore, QtGui

class Widget(QtGui.QLineEdit):
    def __init__(self, parent=None):
        super(Widget, self).__init__(parent)
        lay = QtGui.QVBoxLayout(self)
        for i in range(5):
            btn = QtGui.QPushButton(
                'button {}'.format(i),
                clicked=self.on_clicked
            )
            lay.addWidget(btn)

    @QtCore.pyqtSlot()
    def on_clicked(self):
        btn = self.sender()
        ix = self.layout().indexOf(btn)
        new_btn = QtGui.QPushButton(
            "button {}".format(self.layout().count()),
            clicked=self.on_clicked
        )
        self.layout().insertWidget(ix+1, new_btn)

if __name__ == '__main__':
    import sys

    app = QtGui.QApplication.instance()
    if app is None:
        app = QtGui.QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())
...