PyQt - 在 QThread 中设置代理模型的模型
Posted
技术标签:
【中文标题】PyQt - 在 QThread 中设置代理模型的模型【英文标题】:PyQt - Set model of a proxymodel in QThread 【发布时间】:2013-12-20 16:02:53 【问题描述】:在我的项目中,我注意到主对话框在设置某些 ProxyModel 的模型时会冻结,因此我决定为此任务创建一个新线程以提供窗口的响应能力,但现在它一直弹出错误说: TypeError: QTableView.setModel(QAbstractItemModel): 参数 1 具有意外类型“元组”
我不知道为什么... 这是我的代码:
这是使用我提供的参数更新 proxyModel 的 QThread
class ThreadedProxyModel(QThread):
def __init__(self, contacts, contactsProxyModel, groups, groupsProxyModel,
chatSession, chatSessionProxyModel, msgs, msgsProxyModel):
QThread.__init__(self)
self.contacts = contacts
self.contactsProxyModel = contactsProxyModel
self.groups = groups
self.groupsProxyModel = groupsProxyModel
self.chatSession = chatSession
self.chatSessionProxyModel = chatSessionProxyModel
self.msgs = msgs
self.msgsProxyModel = msgsProxyModel
def run(self):
self.contactsProxyModel.setSourceModel(recordsTableModel(self.contacts))
self.contactsProxyModel.setFilterKeyColumn(-1)
self.contactsProxyModel.setFilterCaseSensitivity(Qt.CaseInsensitive)
self.groupsProxyModel.setSourceModel(recordsTableModel(self.groups))
self.groupsProxyModel.setFilterKeyColumn(-1)
self.groupsProxyModel.setFilterCaseSensitivity(Qt.CaseInsensitive)
self.chatSessionProxyModel.setSourceModel(recordsTableModel(self.chatSession))
self.chatSessionProxyModel.setFilterKeyColumn(-1)
self.chatSessionProxyModel.setFilterCaseSensitivity(Qt.CaseInsensitive)
self.msgsProxyModel.setSourceModel(recordsTableModel(self.msgs))
self.msgsProxyModel.setFilterKeyColumn(-1)
self.msgsProxyModel.setFilterCaseSensitivity(Qt.CaseInsensitive)
def getContactsProxyModel(self):
return self.contactsProxyModel,
def getGroupsProxyModel(self):
return self.groupsProxyModel
def getChatSessionProxyModel(self):
return self.chatSessionProxyModel
def getMsgsProxyModel(self):
return self.msgsProxyModel
这就是在对话框类中调用setProxyModel线程的方法。请注意,所有数据(联系人、群组、聊天会话...)都很好:
def setProxyModel(self):
progress = QProgressDialog("Initializing UI ...", "Abort", 0, 0, self)
progress.setWindowTitle("WhatsApp Browser ...")
progress.setWindowModality(Qt.WindowModal)
progress.setMinimumDuration(0)
progress.setCancelButton(None)
progress.show()
queryTh = ThreadedProxyModel(self.contacts, self.contactsProxyModel, self.groups, self.groupsProxyModel,
self.chatSession, self.chatSessionProxyModel, self.msgs, self.msgsProxyModel,)
queryTh.start()
while queryTh.isRunning():
QApplication.processEvents()
self.contactsProxyModel = queryTh.getContactsProxyModel()
self.groupsProxyModel = queryTh.getGroupsProxyModel()
self.chatSessionProxyModel = queryTh.getChatSessionProxyModel()
self.msgsProxyModel = queryTh.getMsgsProxyModel()
progress.close()
这是在我的对话框中的 init 方法中,我创建代理模型并在线程中调用更新它们的方法,然后在各种 QTableView 中设置它们:
self.contactsProxyModel = QSortFilterProxyModel(self)
self.groupsProxyModel = QSortFilterProxyModel(self)
self.groupMembersProxyModel = QSortFilterProxyModel(self)
self.chatSessionProxyModel = QSortFilterProxyModel(self)
self.chatMsgsProxyModel = QSortFilterProxyModel(self)
self.msgsProxyModel = QSortFilterProxyModel(self)
self.setProxyModel()
self.contactsTableView.setModel(self.contactsProxyModel)
self.contactsTableView.resizeColumnsToContents()
self.groupsTableView.setModel(self.groupsProxyModel)
self.groupsTableView.resizeColumnsToContents()
self.chatSessionTableView.setModel(self.chatSessionProxyModel)
self.chatSessionTableView.resizeColumnsToContents()
self.chatSessionTableView.clicked.connect(self.setChatMsgsProxyModel)
self.chatMsgsTableView.resizeColumnsToContents()
self.groupsTableView.clicked.connect(self.setGroupMembersProxyModel)
self.groupMembersTableView.resizeColumnsToContents()
self.msgsTableView.setModel(self.msgsProxyModel)
self.msgsTableView.resizeColumnsToContents()
谢谢你的建议,我很困惑......
【问题讨论】:
【参考方案1】:不确定,但似乎是
def getContactsProxyModel(self):
return self.contactsProxyModel,
返回一个元组,尝试删除逗号
【讨论】:
天啊...愚蠢的逗号...非常感谢!但对话仍然冻结,对此有何建议?在这一点上,一个想法是在冻结它的 QTableViews 中设置模型......我应该将它也移动到 QThread 吗? 从多个线程访问 Qt 对象是非常危险的。 QObject 类是可重入的(模型子类 QObject 而不是 QWidget)所以理论上我认为你可以在另一个线程中创建一个没有问题的模型,然后在连接之前使用 QObject.moveToThread() 将它移动到主线程与它一个看法。但是,我希望您的程序的缓慢部分是视图从模型中读取数据,因此这对速度没有帮助。说实话,不确定你能做些什么。 Qt 线程指南:doc.qt.digia.com/4.6/threads-qobject.html以上是关于PyQt - 在 QThread 中设置代理模型的模型的主要内容,如果未能解决你的问题,请参考以下文章
如何在 PyQt5 中设置 QTableWidget 的单元格样式?