微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何使用QTableView中的选中复选框检索多行

我正在开发一个应用程序,用户可以在其中选择多个 (

为了检索数据,我使用了以下代码行:

out = (self.model.record(self.view.selectionModel().selectedindexes()  [0].row()).value("NAME"))
    print(out)

它给了我行值。但有一些主要问题:

  1. 如果我选中复选框并取消选中。尽管如此,它仍将其视为已选中。
  2. 如果我选择 n 复选框,它只给出第 n 个选择。简而言之,多项选择不起作用。

我假设我必须创建一个循环。但我无法构建解决方案。

完整代码如下:

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,**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,role)

    def setData(self,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,(role,))
            return True
        return QsqlTableModel.setData(self,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_())

解决方法

复选框的状态与选择混淆。在您的情况下,您必须遍历 checkeable_data 并验证它是否被选中:

def selected(self):
    names = []
    for row,is_checked in self.model.checkeable_data.items():
        if is_checked:
            record = self.model.record(row)
            name = record.value("NAME")
            names.append(name)
    print(names)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。