2015-02-28 2 views
0

У меня есть QTableView, заполненный данными, поступающими из QSqlTableModel. Каждая строка QTableView представляет собой «статью», исходящую с веб-сайта. Статьи могут быть прочитаны или непрочитаны, точно так же, как электронная почта. Состояние чтения/непрочтения сохраняется в базе данных под полем «новый».QTableView: обновить модель «на лету» и выбрать правильную строку

Если изделие непрочитано, оно отображается определенным образом в представлении. Если он читается, он отображается по-другому, например, по электронной почте в любом почтовом менеджере.

Когда пользователь щелкает по статье непрочитанные, статья помечена чтения, что означает, что модель хранения данных обновляется:

def markOneRead(self, element): 

    """Slot to mark an article read""" 

    table = self.liste_tables_in_tabs[self.onglets.currentIndex()] 
    model = self.liste_models_in_tabs[self.onglets.currentIndex()] 
    proxy = self.liste_proxies_in_tabs[self.onglets.currentIndex()] 
    new = table.model().index(element.row(), 12).data() 

    if new == 0: 
     return 
    else: 

     # Save the current line 
     line = table.selectionModel().currentIndex().row() 

     # Update the model 
     table.model().setData(table.model().index(line, 12), 0) 

     try: 
      # Try to update the model 
      model.setQuery(self.query) 
      proxy.setSourceModel(model) 
      table.setModel(proxy) 
     except AttributeError: 
      pass 

     # Once the model is updated, reselect the line saved 
     table.selectRow(line) 

Хотя этот метод в большинстве случаев работает, я только сохранить тока номер строки в переменной «строка». Поэтому, если модель изменилась (из любого другого процесса программы), когда я делаю table.selectRow (строка), я выбираю ту же строку да, но это может быть совершенно другой элемент.

Так что мне нужно более точное средство для хранения щелкнутого элемента, прежде чем обновлять модель.

У вас есть идея?

+0

Я не очень понимаю ваш вопрос. Зачем выбирать строку программно? Если пользователь щелкнет в таблице, он выберет этот элемент/строку. Если вас беспокоит изменение выбора, если новые данные добавляются в верхней части таблицы, вы, вероятно, захотите обновить свою модель выбора при добавлении данных. – HashSplat

+0

Я предполагаю, что вы беспокоитесь о добавлении новых данных в верхнюю часть всех изменений, но выбор остается на месте. Вы можете попытаться добавить данные внизу и изменить направление макета QTableView на BottomToTop. Я не знаю, сработает ли это. Другой вариант - сохранить rowCount, а также переменную строки и проверить для другого rowCount, прежде чем table.selectRow (строка) – HashSplat

+0

Да, вы получили его во втором комментарии, который я думаю. За исключением того, что QTableView сортируется по дате, а элементы, добавленные другим процессом, необязательно добавляются сверху или снизу, поэтому мне нужно точно выбрать выбранный элемент. – Rififi

ответ

0

Мне это удалось! С этого поста (C++): How to refresh a QSqlTableModel while preserving the selection?

Полученный код в питона:

def markOneRead(self, element): 

    """Slot to mark an article read""" 

    table = self.liste_tables_in_tabs[self.onglets.currentIndex()] 
    new = table.model().index(element.row(), 12).data() 

    if new == 0: 
     return 
    else: 

     # Save the current line 
     line = table.selectionModel().currentIndex().row() 
     selected_id = table.selectionModel().selection().indexes()[0].data() 

     # Change the data in the model 
     table.model().setData(table.model().index(line, 12), 0) 

     # Update the view after the model is updated 
     self.updateView(selected_id) 


def updateView(self, current_item_id=None): 

    """Method to update the view after a model change. 
    If an item was selected, the item is re-selected""" 

    model = self.liste_models_in_tabs[self.onglets.currentIndex()] 
    table = self.liste_tables_in_tabs[self.onglets.currentIndex()] 
    proxy = self.liste_proxies_in_tabs[self.onglets.currentIndex()] 

    if current_item_id is not None: 
     selected_id = current_item_id 
    else: 
     try: 
      selected_id = table.selectionModel().selection().indexes()[0].data() 
     except IndexError: 
      selected_id = None 

    try: 
     # Try to update the model 
     model.setQuery(self.query) 
     proxy.setSourceModel(model) 
     table.setModel(proxy) 
    except AttributeError: 
     pass 

    if selected_id is not None: 
     for index in range(1, model.rowCount() + 1): 
      table.selectRow(index) 
      if table.selectionModel().selection().indexes()[0].data() == selected_id: 
       # If the previously selected item is found, leave 
       return 
     # If we are still here, the old item wasn't found, so deselect all 
     table.clearSelection() 

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

  • Нет связанных вопросов^_^