QThread中代理模型的PyQt集模型

2024-09-25 10:18:41 发布

您现在位置:Python中文网/ 问答频道 /正文

在我的项目中,我注意到主对话框在设置某个ProxyModel的模型时会冻结,所以我决定为这个任务创建一个新线程,以提供窗口的响应能力,但是现在它总是弹出一个错误,说:
类型错误:QTableView.setModel(QAbstractItemModel):参数1具有意外的类型“tuple”

我不知道为什么…
我的代码是:

这是用我提供的参数更新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

这是在dialog类中调用setProxyModel线程的方法。请注意,所有数据(联系人、组、聊天会话…)都正常:

^{pr2}$

这是在我的对话框中的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()

谢谢你的建议,我很难接受。。。在


Tags: selfdefgroupscontactsmsgssetmodelqsortfilterproxymodelcontactsproxymodel