В моем проекте я заметил, что основное диалоговое окно зависает, когда оно устанавливает модель некоторого ProxyModel, поэтому я решил создать новый поток для этой задачи, чтобы обеспечить отзывчивость окна , но сейчас он продолжает появляться сообщение об ошибке, что сказать:
TypeError: QTableView.setModel (QAbstractItemModel): аргумент 1 имеет неожиданный тип «кортеж»PyQt - Установить модель проксимодели в QThread
и я не знаю, почему ...
Вот мой код :
Это QThread для обновления proxyModel с аргументами, которые я предоставляю
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 в классе диалога. Обратите внимание на то, что все данные (контакты, группы, ChatSession ...) в порядке:
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()
И это в инициализации метода в диалоге мой, я создать proxymodels и вызвать метод для обновления их нить, а затем я поставил их в различных 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()
Спасибо за любые советы, я довольно застрял ...
Боже мой ... глупо запятая ... спасибо вам большое! , но диалог все еще зависает, любое предложение об этом? На данный момент подумайте, что установка модели в QTableViews, которая ее замораживает ... должен ли я переместить это тоже в QThread? – Rigel
Доступ к объектам Qt из нескольких потоков очень рискован. Класс QObject является повторным (подкласс класса QObject, а не QWidget), поэтому в теории я думаю, что вы могли бы создать модель в другом потоке без проблем, а затем переместить ее в основной поток с помощью QObject.moveToThread(), прежде чем подключать его к вид. Тем не менее, я ожидаю, что медленная часть вашей программы - это данные, считывающие данные из модели, и это не поможет со скоростью. Нет уверенности, что вы можете сделать, чтобы быть честным. Руководство по потоку Qt: http://doc.qt.digia.com/4.6/threads-qobject.html –