繁体   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