2013-12-20 3 views
1

В моем проекте я заметил, что основное диалоговое окно зависает, когда оно устанавливает модель некоторого 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() 

Спасибо за любые советы, я довольно застрял ...

ответ

1

Не уверен, но мне кажется, что

def getContactsProxyModel(self): 
    return self.contactsProxyModel, 

возвращения кортежа, попробуйте удалить запятую

+0

Боже мой ... глупо запятая ... спасибо вам большое! , но диалог все еще зависает, любое предложение об этом? На данный момент подумайте, что установка модели в QTableViews, которая ее замораживает ... должен ли я переместить это тоже в QThread? – Rigel

+0

Доступ к объектам Qt из нескольких потоков очень рискован. Класс QObject является повторным (подкласс класса QObject, а не QWidget), поэтому в теории я думаю, что вы могли бы создать модель в другом потоке без проблем, а затем переместить ее в основной поток с помощью QObject.moveToThread(), прежде чем подключать его к вид. Тем не менее, я ожидаю, что медленная часть вашей программы - это данные, считывающие данные из модели, и это не поможет со скоростью. Нет уверенности, что вы можете сделать, чтобы быть честным. Руководство по потоку Qt: http://doc.qt.digia.com/4.6/threads-qobject.html –

Смежные вопросы