如何解决如何使用QTableView中的选中复选框检索多行
为了检索数据,我使用了以下代码行:
out = (self.model.record(self.view.selectionModel().selectedindexes() [0].row()).value("NAME"))
print(out)
它给了我行值。但有一些主要问题:
- 如果我选中复选框并取消选中。尽管如此,它仍将其视为已选中。
- 如果我选择 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 举报,一经查实,本站将立刻删除。