在 QTableWidget 中禁用多个按钮

Disabling Multiple Buttons in QTableWidget

在我的应用程序中,我们可以向QTableWidget添加项目,随后更新按钮和删除按钮被添加到QTableWidget,更新和删除功能代表网络操作,所以这里我模拟了与进度相关的QTimer酒吧。所以我想在单击 DeleteUpdate 按钮时禁用所有按钮,但单击的按钮除外,并在任务时重新启用所有按钮已完成。

class LoginNew(QMainWindow, ui):
    def __init__(self):
        QMainWindow.__init__(self)
        self.setupUi(self)
        self.show_database()
        self.pushButton.clicked.connect(self.addToTableWidget)
        
    

    def addToTableWidget(self):
       
        self.row_data = []
        self.val1 =  self.lineEdit.text()
        self.row_data.append(self.val1)
        self.val2 = self.lineEdit_2.text()
        self.row_data.append(self.val2)
        self.val3 =  self.lineEdit_3.text()
        self.row_data.append(self.val3)


        row = self.tableWidget.rowCount()
        self.tableWidget.setRowCount(row+1)
        col = 0
        for item in self.row_data:
            cell = QTableWidgetItem(str(item))
            self.tableWidget.setItem(row, col, cell)
            col += 1
        
        db_new.insert(self.val1,self.val2, self.val3)
       
        for index in range(self.tableWidget.rowCount()):
            self.btx =  QPushButton(self.tableWidget)
            self.btn =  QPushButton(self.tableWidget)
            self.btx.setText("Update")
            self.btn.setIcon(QIcon(QPixmap("delete.png")))
            self.btn.setIconSize(QSize(35,45))
            self.btx.clicked.connect(self.update_pos)
            self.btn.clicked.connect(self.delete_pos)
            self.tableWidget.setCellWidget(index,3, self.btx)
            self.tableWidget.setCellWidget(index,4,self.btn)
        
    
    def show_database(self):
        res = db_new.fetch_data()
        self.tableWidget.setRowCount(0)
        for row_number, row_data in enumerate(res):
            self.tableWidget.insertRow(row_number)
            for column_number, data in enumerate(row_data):
                self.tableWidget.setItem(row_number, column_number+1  ,  QTableWidgetItem(str(data)))
        

        for index in range(self.tableWidget.rowCount()):
            self.btx =  QPushButton(self.tableWidget)
            self.btn =  QPushButton(self.tableWidget)
            self.btx.setText("Update")
            self.btn.setIcon(QIcon(QPixmap("delete.png")))
            self.btn.setIconSize(QSize(35,35))
            self.btx.clicked.connect(self.update_pos)
            self.btn.clicked.connect(self.delete_pos)
            self.tableWidget.setCellWidget(index,4, self.btx)
            self.tableWidget.setCellWidget(index,0,self.btn)

    def update_pos(self):
        self.button =self.focusWidget()
        self.index = self.tableWidget.indexAt(self.button.pos())
        self.button.clicked.connect(self.btn_trigger)
    
    def btn_trigger(self):

        QMessageBox.information(self, "Update Data", f' Value  is {self.index.row()} {self.index.column()}')
        self.geti=10
        self.timer = QTimer()
        self.timer.timeout.connect(self.num)
        self.timer.start(2000)
        self.show_database()
       

    
    def cell_was_clicked(self, row,column, kale):
        print("Row %d and Column %d was clicked" % (row, column))
        item = self.tableWidget.itemAt(row, column)
        self.ID = item.text()
        QMessageBox.information(self, "INFORMATION",f'ID VALUE is  {item.text()}')
        
    
    def delete_pos(self):

        print("delete Button was clicked")
        self.geti=0
        self.timer = QTimer()
        self.timer.timeout.connect(self.num)

        self.timer.start(1000)
    


    def num(self):

        if self.geti <9999:
            print ( self.geti )
            self.geti += 1
            self.progressBar.setValue(self.geti)
        else:
            self.timer.stop()

def main():
    app =  QApplication(sys.argv)
    win = LoginNew()
    win.show()
    app.exec_()


if __name__ =='__main__':
    main()




我试过使用 self.btx.setEnabled(False) 但我无法决定应该禁用哪些所有按钮??

Link 表示 UI 图片 Actual Ui

手头的任务是:

I want to disable all the buttons whenever I clicked the Delete or Update buttons except the button which is clicked

一个解决方案可能是:

  1. 保留所有按钮的列表
  2. 编写一个方法来禁用除指定按钮(在参数中)之外的所有按钮。 您可以遍历所有按钮并与指定按钮进行比较以确定禁用或启用
  3. 为每个按钮编写一个小的 lambda,以按钮作为参数调用 (2) 中的方法。将此 lambda 连接到按钮的按下事件

或者,您也可以使用 QSignalMapper。然后,您可以将映射信号连接到 (2) 中的方法。

如果您只想将所有特定元素(如 lineEdits)收集到一个 可迭代集合,如列表,这里有一个一次性函数,可让您将各种指令传递给该函数以影响其所有字段。

我希望这个例程对某人有所帮助。 ~迈克


        def all_fields(switch=""):
            field_list = [  self.lineEdit_1,
                            self.lineEdit_2,
                            self.lineEdit_3,
                            self.lineEdit_4,
                            self.lineEdit_5,
                            self.lineEdit_6,
                            self.lineEdit_7,
                            self.lineEdit_8,
                            self.lineEdit_9,
                            self.lineEdit_10,
                            self.textEdit  ]
            for field in field_list:
                if str(switch).lower() == "clear":
                    field.clear()
                elif str(switch).lower() == "disable":
                    field.setDisabled(True)
                elif str(switch).lower() == "enable":
                    field.setDisabled(False)

        all_fields("disable")