首页 > 解决方案 > 如何在 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_())

标签: pythonpyqt5

解决方案


您只需要获取项目的位置并用于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)

推荐阅读