簡體   English   中英

PyQt5 用戶可檢查 QTableWidget

[英]PyQt5 User Checkable QTableWidget

我想使用 SQLite 數據庫創建一個表。 在表中用戶可以 select 最多 5 項。 我們將在另一個頁面中評估這些項目。

當前狀態:我使用 Qt Designer 創建了一個表。 我已將 SQL 數據提取到表中。 在我使用的表中插入名稱列時:

item.setFlags(QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsEnabled) item.setCheckState(QtCore.Qt.Unchecked)

現在,我在每個名字旁邊都有復選框。 但我無法理解如何處理用戶選擇。 我嘗試使用“itemClicked”,但無法確定單擊了哪個項目。

有人知道如何索引我的項目和相應的復選框,以便我可以獲取用戶選擇的特定行嗎?

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'dbTable.ui'
#
# Created by: PyQt5 UI code generator 5.15.2
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QWidget
import sys

import sqlite3



from PyQt5.QtWidgets import QTableWidgetItem



class Ui_MainWindow(QWidget):

    def message(self):

        print("selected")



    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.tableWidget = QtWidgets.QTableWidget(self.centralwidget)
        self.tableWidget.setGeometry(QtCore.QRect(70, 130, 580, 650))
        self.tableWidget.setRowCount(20)
        self.tableWidget.setColumnCount(5)
        self.tableWidget.setObjectName("tableWidget")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(630, 40, 131, 41))
        self.pushButton.setObjectName("pushButton")
        MainWindow.showMaximized()
        MainWindow.setCentralWidget(self.centralwidget)


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

        # this is the method for selecting data


        mydb = sqlite3.connect("ppcp_database.db")

        mycursor = mydb.cursor()

        mycursor.execute("SELECT ALL Name FROM Table1")


        self.tableWidget.setRowCount(20)
        rowIndex_col0 = 0
        rowIndex_col1 = 0
        rowIndex_col2 = 0
        rowIndex_col3 = 0
        rowIndex_col4 = 0



        for row in mycursor.execute("SELECT ALL Name FROM Table1"):

            item = QTableWidgetItem(row[0])
            item.setFlags(QtCore.Qt.ItemIsUserCheckable |
                          QtCore.Qt.ItemIsEnabled)
            item.setCheckState(QtCore.Qt.Unchecked)
            self.tableWidget.setItem(rowIndex_col0, 0, item)





            rowIndex_col0+=1

        self.tableWidget.itemClicked.connect(self.message)







        for row in mycursor.execute("SELECT ALL Solubility FROM Table2"):
            self.tableWidget.setItem(rowIndex_col1, 1, QTableWidgetItem(row[0]))
            rowIndex_col1+=1

        for row in mycursor.execute("SELECT ALL Volatility FROM Table2"):
            self.tableWidget.setItem(rowIndex_col2, 2, QTableWidgetItem(row[0]))
            rowIndex_col2+=1

        for row in mycursor.execute("SELECT ALL Adsorbability FROM Table2"):
            self.tableWidget.setItem(rowIndex_col3, 3, QTableWidgetItem(row[0]))
            rowIndex_col3+=1

        for row in mycursor.execute("SELECT ALL Degradability FROM Table2"):
            self.tableWidget.setItem(rowIndex_col4, 4, QTableWidgetItem(row[0]))
            rowIndex_col4+=1

            

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton.setText(_translate("MainWindow", "Evaluate"))





if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

這段代碼對我有用:

class TableModel(QSqlTableModel):
def __init__(self, *args, **kwargs):
    QSqlTableModel.__init__(self, *args, **kwargs)
    self.checkeable_data = {}

def flags(self, index):
    fl = QSqlTableModel.flags(self, index)
    if index.column() == 0:
        fl |= Qt.ItemIsUserCheckable
    return fl

def data(self, index, role=Qt.DisplayRole):
    if role == Qt.CheckStateRole and (
        self.flags(index) & Qt.ItemIsUserCheckable != Qt.NoItemFlags
    ):
        i
f index.row() not in self.checkeable_data.keys():
            self.setData(index, Qt.Unchecked, Qt.CheckStateRole)
        return self.checkeable_data[index.row()]
    else:
        return QSqlTableModel.data(self, index, role)

def setData(self, index, value, role=Qt.EditRole):
    if role == Qt.CheckStateRole and (
        self.flags(index) & Qt.ItemIsUserCheckable != Qt.NoItemFlags
     ):
        self.checkeable_data[index.row()] = value
        self.dataChanged.emit(index, index, (role,))
        return True
    return QSqlTableModel.setData(self, index, value, role) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM