禁用QTableWidget中的多个按钮

2024-05-15 23:36:15 发布

您现在位置:Python中文网/ 问答频道 /正文

在我的应用程序中,我们可以将项目添加到QTableWidget,随后更新按钮和删除按钮添加到QTableWidget,更新和删除功能代表网络操作,因此这里我使用链接到进度条的QTimer进行了模拟。因此,每当我单击删除更新按钮时,我想禁用所有按钮,但单击的按钮除外,并在任务完成时重新启用所有按钮

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),但我无法决定应该禁用哪些按钮

UI图像的链接 Actual Ui


Tags: posselfdataindexdefconnectcolumndelete
2条回答

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

我希望这个例行公事对某人有帮助~迈克


        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")

目前的任务是:

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)中的方法

相关问题 更多 >