Python 如何在QTableView中使用复选框检索多行

Python 如何在QTableView中使用复选框检索多行,python,pyqt,pyqt5,qtableview,qsqltablemodel,Python,Pyqt,Pyqt5,Qtableview,Qsqltablemodel,我正在开发一个应用程序,用户可以在其中选择多个(复选框的状态与选择相混淆。在您的情况下,您必须迭代可检查的_数据,并验证是否选中: def已选择(自身): 名称=[] 对于行,是否签入self.model.checkeable\u data.items(): 如果已选中,则: 记录=self.model.record(行) 名称=记录值(“名称”) name.append(name) 打印(姓名) 复选框的状态与所选内容相混淆。在您的情况下,您必须迭代可检查的数据,并验证是否已选中: def已选

我正在开发一个应用程序,用户可以在其中选择多个(复选框的状态与选择相混淆。在您的情况下,您必须迭代
可检查的_数据
,并验证是否选中:

def已选择(自身):
名称=[]
对于行,是否签入self.model.checkeable\u data.items():
如果已选中,则:
记录=self.model.record(行)
名称=记录值(“名称”)
name.append(name)
打印(姓名)

复选框的状态与所选内容相混淆。在您的情况下,您必须迭代可检查的数据,并验证是否已选中:

def已选择(自身):
名称=[]
对于行,是否签入self.model.checkeable\u data.items():
如果已选中,则:
记录=self.model.record(行)
名称=记录值(“名称”)
name.append(name)
打印(姓名)

我不理解第1点:复选框的状态与项目或行的选定状态不同。嘿,我也对此表示怀疑。我的目标是仅在选中(未选中)时检索数据。我假设,我需要更改标志。是吗?我不理解第1点:复选框的状态与项目或行的选定状态不同。嘿,我也对此表示怀疑。我的目标是仅在选中(未选中)时检索数据。我假设,我需要更改标志。是吗?谢谢@Eyllansecman。你是救世主。您好@eyllanesc…我想再次获得有关此文件的帮助。此文件完全可以单独工作。但是,当我将此文件与另一个文件连接时,sql表不可见。我假设,当连接此文件时,只有RealMainWindow()在没有sql连接的情况下显示。您有什么建议吗?谢谢@eyllansec man。您是一位救世主。您好@eyllanesc…我再次需要有关此文件的帮助。此文件完全可以单独工作。但是,当我将此文件与另一个文件连接时,sql表不可见。我假设,在连接此文件时,只有RealMainWindow()正在显示没有sql连接的。您有什么建议吗?
out = (self.model.record(self.view.selectionModel().selectedIndexes()  [0].row()).value("NAME"))
    print(out)
import sys

from PyQt5 import QtCore, QtWidgets
from PyQt5.QtWidgets import QVBoxLayout, QPushButton
from PyQt5 import QtGui
from PyQt5.QtCore import Qt, QModelIndex
from PyQt5.QtSql import QSqlDatabase, QSqlTableModel, QSqlQuery
from PyQt5.QtWidgets import (QApplication, QMainWindow, QMessageBox, QTableView,  QPushButton, QGridLayout, QGroupBox, QVBoxLayout)
from PyQt5 import QtCore
from PyQt5.QtCore import pyqtSignal


class RealMainWindow(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)

        self.setWindowTitle("QTableView Example")
        self.resize(415, 200)
        # Set up the model
        self.button = QPushButton("check", self)
        self.button.clicked.connect(self.selected)
        self.button.move(1000, 1110)

        self.model = TableModel(self)
        self.model.setTable("Table2")
        self.model.setEditStrategy(QSqlTableModel.OnFieldChange)
        #self.model.setHeaderData(0, Qt.Horizontal, "ID")


        self.model.select()
        # Set up the view
        self.view = QTableView()
        self.view.setModel(self.model)
        #self.view.resizeColumnsToContents()

        central_widget = QtWidgets.QWidget()
        self.setCentralWidget(central_widget)
        lay = QVBoxLayout(central_widget)
        lay.addWidget(self.button)
        lay.addWidget(self.view)


     def selected(self):
        out = (self.model.record(self.view.selectionModel().selectedIndexes()[0].row()).value("NAME"))
        print(out)
        


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
        ):
            if 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)


def createConnection():

    con = QSqlDatabase.addDatabase("QSQLITE")
    con.setDatabaseName("ppcp_database.db")
    if not con.open():
        QMessageBox.critical(
            None,
            "QTableView Example - Error!",
            "Database Error: %s" % con.lastError().databaseText(),
        )
        return False
    return True

app = QApplication(sys.argv)
if not createConnection():
sys.exit(1)
win = RealMainWindow()
win.show()
sys.exit(app.exec_())