python - 如何在 PyQt5 中单击按钮时从表格中删除复选框?
问题描述
我正在创建一个房间预订程序,对于这个程序,我使用一个表格,以便用户可以选中复选框并单击预订,我的程序会将详细信息添加到数据库中。但是,为了确保一个房间+时间段的超额预订不会发生,我希望有某种迹象表明房间+时间段已经被占用 - 所以我想我可以删除复选框,一旦它被添加到数据库。有没有办法做到这一点,或者我应该创建一个错误窗口,因为房间和时间组合已经在数据库中?
有人对我如何证明房间+时间段已经预订有任何其他建议吗?
主窗口
class Ui_ViewAllRooms(QtWidgets.QMainWindow, Ui_ViewAllRooms):
def __init__(self, username, parent=None):
super(Ui_ViewAllRooms, self).__init__(parent)
self.username = username
self.setupUi(self)
self.dialogBook = Ui_DialogBook()
self.book_Button.clicked.connect(self.book_clicked)
@QtCore.pyqtSlot()
def book_clicked(self):
self._checked_items = []
for i in range(self.tableWidget.rowCount()):
for j in range(self.tableWidget.columnCount()):
item = self.tableWidget.item(i, j)
if item.checkState() == QtCore.Qt.Checked:
self.v = self.tableWidget.horizontalHeaderItem(j).text()
self.h = self.tableWidget.verticalHeaderItem(i).text()
self._checked_items.append([self.h, self.v, self.tableWidget.item(i, j).text()])
self.dialogBook.listWidget.clear()
self.dialogBook.listWidget.addItems([ "{} {} {}".format(self.h, self.v, it) for self.h, self.v, it in self._checked_items])
self.dialogBook.show()
self.dialogBook.yes_button.clicked.connect(self.addBooking)
def addBooking(self):
now = QDate.currentDate()
now1 = now.toString(Qt.DefaultLocaleLongDate)
room,lesson,irr = zip(*self._checked_items)
connection = sqlite3.connect("roombooking.db")
c = connection.cursor()
lastBookingId = []
for item in lesson:
c.execute("INSERT INTO Booking (lessonBooked, dateBooked, username) VALUES (?,?,?)",(item,now1,self.username))
connection.commit()
lastBookingId.append (c.lastrowid)
for i in range (len (lastBookingId)):
roomb = room[i]
lastBookingId1 = lastBookingId[i]
c.execute ("INSERT INTO BookedRoom (roomNO, bookingID) VALUES (?, ?)",(roomb,lastBookingId1))
connection.commit()
##### I would like the checkboxes selected to be removed somewhere here #####
self.dialogBook.hide()
Ui_ViewAllRooms
class Ui_ViewAllRooms(object):
def setupUi(self, ViewAllRooms):
ViewAllRooms.setObjectName("ViewAllRooms")
ViewAllRooms.resize(671, 347)
self.centralwidget = QtWidgets.QWidget(ViewAllRooms)
self.centralwidget.setObjectName("centralwidget")
self.tableWidget = QtWidgets.QTableWidget(self.centralwidget)
self.tableWidget.setGeometry(QtCore.QRect(10, 100, 651, 181))
self.tableWidget.setObjectName("tableWidget")
self.tableWidget.setColumnCount(6)
self.tableWidget.setRowCount(5)
self.tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)
self.tableWidget.setHorizontalHeaderLabels("P1 P2 P3 P4 P5 P6".split())
self.tableWidget.setVerticalHeaderLabels("C101 C214 C320 F04 E201".split())
for i in range(self.tableWidget.rowCount()):
for j in range(self.tableWidget.columnCount()):
item = QtWidgets.QTableWidgetItem()
item.setFlags(item.flags() | QtCore.Qt.ItemIsUserCheckable)
item.setCheckState(QtCore.Qt.Unchecked)
self.tableWidget.setItem(i, j, item)
self._checked_items = []
self.book_Button = QtWidgets.QPushButton(self.centralwidget)
self.book_Button.setGeometry(QtCore.QRect(300, 290, 75, 23))
self.book_Button.setObjectName("book_Button")
ViewAllRooms.setCentralWidget(self.centralwidget)
self.retranslateUi(ViewAllRooms)
QtCore.QMetaObject.connectSlotsByName(ViewAllRooms)
def retranslateUi(self, ViewAllRooms):
_translate = QtCore.QCoreApplication.translate
ViewAllRooms.setWindowTitle(_translate("ViewAllRooms", "MainWindow"))
item = self.tableWidget.verticalHeaderItem(0)
item.setText(_translate("ViewAllRooms", "C101"))
item = self.tableWidget.verticalHeaderItem(1)
item.setText(_translate("ViewAllRooms", "C214"))
item = self.tableWidget.verticalHeaderItem(2)
item.setText(_translate("ViewAllRooms", "C320"))
item = self.tableWidget.verticalHeaderItem(3)
item.setText(_translate("ViewAllRooms", "F04"))
item = self.tableWidget.verticalHeaderItem(4)
item.setText(_translate("ViewAllRooms", "E201"))
item = self.tableWidget.horizontalHeaderItem(0)
item.setText(_translate("ViewAllRooms", "P1"))
item = self.tableWidget.horizontalHeaderItem(1)
item.setText(_translate("ViewAllRooms", "P2"))
item = self.tableWidget.horizontalHeaderItem(2)
item.setText(_translate("ViewAllRooms", "P3"))
item = self.tableWidget.horizontalHeaderItem(3)
item.setText(_translate("ViewAllRooms", "P4"))
item = self.tableWidget.horizontalHeaderItem(4)
item.setText(_translate("ViewAllRooms", "P5"))
item = self.tableWidget.horizontalHeaderItem(5)
item.setText(_translate("ViewAllRooms", "P6"))
__sortingEnabled = self.tableWidget.isSortingEnabled()
self.tableWidget.setSortingEnabled(False)
self.tableWidget.setSortingEnabled(__sortingEnabled)
self.book_Button.setText(_translate("ViewAllRooms", "Book"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
ViewAllRooms = QtWidgets.QMainWindow()
ui = Ui_ViewAllRooms()
ui.setupUi(ViewAllRooms)
ViewAllRooms.show()
sys.exit(app.exec_())
解决方案
您只需要获取项目的位置并用于takeItem()
删除:
for i in range(self.tableWidget.rowCount()):
for j in range(self.tableWidget.columnCount()):
item = self.tableWidget.item(i, j)
if item.checkState() == QtCore.Qt.Checked:
it = self.tableWidget.takeItem(i, j)
推荐阅读
- sql - 如何通过 SQL 使用 if 条件更新表
- python - Python 无法连接到 XAMPP 上的数据库
- javascript - 为什么带有etherjs的BigNumber返回0
- android - 从仅导出全局和可见符号的静态存档 (`.a`) 创建共享库 (`.so`)
- node.js - mongodb无缘无故占用大量存储空间
- javascript - TypeError:使用带有功能组件的redux时无法读取属性
- android - 是否可以在viewpager android中只创建一个可滑动的视图
- julia - julia eval 一个包含转义变量的表达式
- database - PostgreSQL - 在查询多个值以及 CTE 时不使用索引
- python - Python、并发和异步:添加旋转代理的问题