python - 内部带有 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"))
解决方案
推荐阅读
- python - 如何在 wagtail 中使用 RichTextEditor (drafttail) 以用不同的样式标记文本的不同部分?
- javascript - jQuery 脚本在 IE 中无法正常工作
- c# - 使用 Bot Framework 4 的一对一主动消息传递
- c++ - 如何修复 DirectX9 中的纹理
- javascript - 在非结构化对象数组中查找不同键的数量
- angular - 如何在图片中获取数据
- java - 如何在 Month End 之后的 12-MARCH-2019 字符串中添加“\n”。我想要这个 12-MARCH\n-2019 in java
- phoenix - apache phoenix 本地索引在 upsert 后是否立即生效?
- c - STM32F3如何使用MODBUS TCP?
- java - 不同对象初始化的方法同步工作方式不同