首页 > 解决方案 > 内部带有 QPushbutton 的 QTableWidget:按钮不会消失

问题描述

我正在使用 PyQt5,并且我有一个 qtablewidget,我在其中列出了数据库中的项目。每个项目都有一个进入时间和退出时间,但所有退出时间一开始都是空的。我正在使用一种逻辑,例如退出时间是否为空显示一个按钮,但如果不显示退出时间。我可以使用按钮更改退出时间,我希望按钮在更改后消失,但在我重新启动程序之前按钮不会消失。

我有另一个用于编辑行的按钮,我用它来了解情况并将其插入一个函数以将 exitTime 更改为空。如果我单击编辑 exitTime 更改为空并且退出按钮返回但我无法通过单击退出来使退出按钮消失

def loadData(self):
    databse.connection
    result = mcursor.fetchall()

    row=0
    self.ui.carList.setRowCount(len(result))

    for r in result:
        self.btn_sell = QtWidgets.QPushButton('Çıkış')
        self.btn_sell.clicked.connect(self.handleButtonClicked)
        self.btnEdit = QtWidgets.QPushButton('Düzenle')
        self.btnEdit.clicked.connect(self.updateDialog)

        self.ui.carList.setItem(row, 0, QtWidgets.QTableWidgetItem(r[1]))
        self.ui.carList.setItem(row, 1, QtWidgets.QTableWidgetItem(r[2]))
        self.ui.carList.setItem(row, 2, QtWidgets.QTableWidgetItem(r[3]))
        self.ui.carList.setItem(row, 3, QtWidgets.QTableWidgetItem(r[5].strftime('%H:%M:%S %Y-%m-%d')))
        if r[6].strftime('%Y-%m-%d %H:%M:%S') == "1000-01-01 00:00:00":
            self.ui.carList.setCellWidget(row, 4, self.btn_sell)
        else:
            self.ui.carList.setItem(row, 4, QtWidgets.QTableWidgetItem(r[6].strftime('%H:%M:%S %Y-%m-%d')))

        self.ui.carList.setCellWidget(row, 5, self.btnEdit)

        row += 1

列表的图像

最小的可重现示例:

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QFileDialog, QMainWindow, QStyleFactory, QTabWidget, QInputDialog
from stack import Ui_MainWindow
from PyQt5.QtGui import QPixmap, QImage
import os
from datetime import datetime



 def dbFunc(): # for creating the list for the first time
        db = [["ahmet", "yıldırım", "KS67AEA", "23:09:39 2021-04-09", "23:09:39 2021-04-09"],
                  ["mahmut", "celik", "TR67AKH", "23:09:39 2021-04-09", "1000-01-01 00:00:00"],
                  ["mehmet", "gezen", "YU67OKY", "23:09:39 2021-04-09", "23:09:39 2021-04-09"],
                  ["hakan", "duz", "PT67LDK", "23:09:39 2021-04-09", "1000-01-01 00:00:00"],
                  ["ayse", "kavruk", "EO67KHL", "23:09:39 2021-04-09", "1000-01-01 00:00:00"]]
        #print(db)

    f = open("dbText.txt", "a")
    for item in db:
        for i in item:
            f.write(i)
            f.write(",")
        f.write("\n")
    f.close()



   def toList():#read list
        f = open("dbText.txt", "r")
        dbList = f.read()
        dbList = dbList.split("\n")
        list = []
        for i in dbList:
            list.append(i.split(",")[:-1])
        list.pop(-1)
        f.close()
        return list
    
    def refreshFile(db):
        os.remove('./dbText.txt')
        f = open("dbText.txt", "a")
        for item in db:
            for i in item:
                f.write(i)
                f.write(",")
            f.write("\n")
        f.close()
    
    
    class stapp(QMainWindow):
        def __init__(self):
            super(stapp, self).__init__()
            self.ui = Ui_MainWindow()
            self.ui.setupUi(self)
            self.loadData()
    
      

  #dbFunc() # for creating the list for the first time
dbList = toList()

def loadData(self):

    result = self.dbList
    row=0
    self.ui.tableWidget.setRowCount(len(result))

    for r in result:
        self.btn_sell = QtWidgets.QPushButton('Çıkış')
        self.btn_sell.clicked.connect(self.exit)
        self.btnEdit = QtWidgets.QPushButton('Düzenle')
        self.btnEdit.clicked.connect(self.updateDialog)

        self.ui.tableWidget.setItem(row, 0, QtWidgets.QTableWidgetItem(r[0]))
        self.ui.tableWidget.setItem(row, 1, QtWidgets.QTableWidgetItem(r[1]))
        self.ui.tableWidget.setItem(row, 2, QtWidgets.QTableWidgetItem(r[2]))
        self.ui.tableWidget.setItem(row, 3, QtWidgets.QTableWidgetItem(r[3]))
        if r[4] == "1000-01-01 00:00:00":
            self.ui.tableWidget.setCellWidget(row, 4, self.btn_sell)
        else:
            self.ui.tableWidget.setItem(row, 4, QtWidgets.QTableWidgetItem(r[4]))

        self.ui.tableWidget.setCellWidget(row, 5, self.btnEdit)

        row += 1

def exit(self):
    button = QtWidgets.qApp.focusWidget()
    index = self.ui.tableWidget.indexAt(button.pos())
    if index.isValid():

        result = self.dbList
        now = datetime.now()
        time = now.strftime('%Y-%m-%d %H:%M:%S')

        result[index.row()][4] = time
        refreshFile(self.dbList)
        self.loadData()

def updateDialog(self):
    button = QtWidgets.qApp.focusWidget()
    index = self.ui.tableWidget.indexAt(button.pos())
    if index.isValid():

        result = self.dbList
        time = "1000-01-01 00:00:00"

        result[index.row()][4]=time
        self.loadData()


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    app.setStyle(QStyleFactory.create('GTK+'))
    win = stapp()
    win.show()
    sys.exit(app.exec_())

用户界面:

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(424, 279)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.tableWidget = QtWidgets.QTableWidget(self.centralwidget)
        self.tableWidget.setGeometry(QtCore.QRect(10, 10, 401, 221))
        self.tableWidget.setObjectName("tableWidget")
        self.tableWidget.setColumnCount(6)
        self.tableWidget.setRowCount(0)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(0, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(1, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(2, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(3, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(4, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(5, item)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 424, 21))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

def retranslateUi(self, MainWindow):
    _translate = QtCore.QCoreApplication.translate
    MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
    item = self.tableWidget.horizontalHeaderItem(0)
    item.setText(_translate("MainWindow", "name"))
    item = self.tableWidget.horizontalHeaderItem(1)
    item.setText(_translate("MainWindow", "surname"))
    item = self.tableWidget.horizontalHeaderItem(2)
    item.setText(_translate("MainWindow", "enterTime"))
    item = self.tableWidget.horizontalHeaderItem(3)
    item.setText(_translate("MainWindow", "exitTime"))
    item = self.tableWidget.horizontalHeaderItem(4)
    item.setText(_translate("MainWindow", "exit"))
    item = self.tableWidget.horizontalHeaderItem(5)
    item.setText(_translate("MainWindow", "edit"))

标签: pythonpyqt5qtablewidgetqpushbutton

解决方案


推荐阅读