【问题标题】:Disabling Multiple Buttons in QTableWidget在 QTableWidget 中禁用多个按钮
【发布时间】:2021-06-15 10:09:10
【问题描述】:

在我的应用程序中,我们可以向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),但我无法决定应该禁用哪些所有按钮??

用户界面图片的链接 Actual Ui

【问题讨论】:

    标签: python pyqt pyqt5


    【解决方案1】:

    如果您只想将所有特定元素(例如 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")
    

    【讨论】:

      【解决方案2】:

      手头的任务是:

      我想在单击删除或更新按钮时禁用所有按钮,但单击的按钮除外

      一种解决方案可能是:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-15
        • 2018-11-17
        • 1970-01-01
        • 2018-08-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多