PyQt5 Butona Basınca Buton Ekleme | Silme

resimde gördüğünüz gibi kırmızı ile işaretli + butonuna basınca 1 adet buton1 oluşturmasını istiyorum , bu işlem tekrarlanınca altına 1 tane daha oluşturmasını bu işlem tekrarlandığı sürece alt alta böyle devam etmesini istiyorum aynı zamanda yeşil ile işaretli yerdeki butona basınca butonu silmesini açık mavi ile işaretli yere basınca butonun işlevlerini devre dışı bırakmasını koyu mavi ile işaretli yere basınca seçili butonun sıralamasını yukarı alması gibi şeyler yapıcam nasıl bir yol izliyebilirim konu hakkıda fazla kaynak bulamadım şimdiden çok teşekkürler

İstediğiniz özelliklerin tamamını yapdım. Taşıma işlemleri sorun çıkarıyor, bir widget olduğu için direkt taşınmıyor,yeniden tanimlamam gerekdi.
QListWidget kullandim. ama belki QTableWidget kullanarak da yapıla bilir.

from PyQt5.QtWidgets import QWidget,QListWidget,QListWidgetItem,QPushButton,QHBoxLayout,QVBoxLayout,QApplication


class Pencere(QWidget):
    def __init__(self):
        super().__init__()

        self.setFixedSize(300,600)

        self.ui()


        self.bt_numarasi = 1


    def ui(self):
        BT_ekle = QPushButton('+')
        BT_ekle.clicked.connect( self.bt_ekle )

        BT_sil = QPushButton('-')
        BT_sil.clicked.connect( self.bt_sil )

        BT_devre_disi = QPushButton('x')
        BT_devre_disi.clicked.connect(self.bt_devre_disi_birak)

        BT_yukari = QPushButton('<')
        BT_yukari.clicked.connect(self.bt_yukari_tasi)  # doğru çalışmıyor

        BT_asagi = QPushButton('>')
        BT_asagi.clicked.connect(self.bt_asagi_tasi)   # doğru çalışmıyor


        self.LW_list = QListWidget()
        self.LW_list.setStyleSheet('QListWidget::item:selected { background: red; }')


        hbox_BT = QHBoxLayout()
        hbox_BT.addWidget( BT_ekle )
        hbox_BT.addWidget( BT_sil )
        hbox_BT.addWidget( BT_devre_disi )
        hbox_BT.addWidget( BT_yukari )
        hbox_BT.addWidget( BT_asagi )

        vbox = QVBoxLayout()
        vbox.addLayout(hbox_BT)
        vbox.addWidget(self.LW_list)

        self.setLayout(vbox)



    def bt_ekle(self):

        item = QListWidgetItem()


        bt = QPushButton( f'Button {self.bt_numarasi}' )
        bt.setObjectName( f'bt_{self.bt_numarasi}' )
        bt.clicked.connect(self.bt_click)


        item.setSizeHint(bt.sizeHint())

        self.LW_list.addItem(item)
        self.LW_list.setItemWidget(item, bt)

        self.bt_numarasi += 1



    def bt_click(self):
        #hangi button-a tıkladığımızı yakalamak için
        bt_obj_name = self.sender().objectName()
        print(bt_obj_name,' tiklandı')



    def bt_sil(self):
        row = self.LW_list.currentRow()

        if row != -1:    # her hangi bir satır seçilmezse -1 döndürür ve silme gerçekleşmez
            self.LW_list.takeItem(row)


    def bt_devre_disi_birak(self):
        # seçili buttona bir kez tikladiğinda devre dişi kalır, bir kez daha tikladiğinda yeniden aktiv olur

        row = self.LW_list.currentRow()

        if row != -1:
            item = self.LW_list.item(row)

            bt = self.LW_list.itemWidget(item)

            if bt.isEnabled():
                bt.setEnabled(False)
            else:
                bt.setEnabled(True)

            self.LW_list.setItemWidget(item,bt)


    def bt_yukari_tasi(self):
        # bu kısmı biraz uzun yoldan yapmalı oldum.Buttonu yeniden tanimlamam gerekdi.Çünki eski gözükmüyor, sorun yaratıyor

        row= self.LW_list.currentRow()

        if row != -1:
            item_old = self.LW_list.item(row)

            bt_old = self.LW_list.itemWidget(item_old)

            obj_name = bt_old.objectName()



            bt_new =QPushButton(f"Button {obj_name.split('_')[1]}")
            bt_new.setObjectName(obj_name)
            bt_new.clicked.connect(self.bt_click)


            self.LW_list.takeItem(row)


            item = QListWidgetItem()
            item.setSizeHint(bt_new.sizeHint())


            self.LW_list.insertItem(row - 1, item)
            self.LW_list.setItemWidget(item, bt_new)





    def bt_asagi_tasi(self):
        row = self.LW_list.currentRow()

        if row != -1:

            item_old = self.LW_list.item(row)

            bt_old = self.LW_list.itemWidget(item_old)

            obj_name = bt_old.objectName()



            bt_new =QPushButton(f"Button {obj_name.split('_')[1]}")
            bt_new.setObjectName(obj_name)
            bt_new.clicked.connect(self.bt_click)


            self.LW_list.takeItem(row)


            item = QListWidgetItem()
            item.setSizeHint(bt_new.sizeHint())


            self.LW_list.insertItem(row + 1, item)
            self.LW_list.setItemWidget(item, bt_new)










if __name__ == '__main__':
    app = QApplication([])
    pen = Pencere()
    pen.show()
    app.exec()


1 Beğeni