Некоторые ячейки в QtableView не перекрашиваются автоматически после нажатия на ячейку таблицы - PullRequest
1 голос
/ 08 июня 2011

Я использую QTableView для реализации интерактивной настольной игры.Изображения должны отображаться в ячейках таблицы.Я использую QStyledItemDelegate с функцией рисования для рисования изображений внутри ячеек таблицы.

Поскольку изображения должны отображаться только в определенных ячейках таблицы и обновляться, когда пользователь нажимает на ячейку таблицы, используется массив double int, который имеет те же размеры, что и таблица.В зависимости от значений массива, художник должен рисовать изображения в определенных ячейках таблицы.Первоначально в 4 ячейках таблицы есть только 4 изображения, и, когда пользователь нажимает на ячейку таблицы, массив обновляется, что должно означать, что то, что нарисовано и отображено внутри ячеек таблицы, должно быть изменено.

Обычно пользователь нажимает на пустую (белую) ячейку, которая успешно обновляется, и в ячейке отображается конкретное изображение.Однако, если есть другие ячейки, которые содержат изображение и должны быть обновлены, обновление не отображается, хотя массив double int обновляется.Я также увидел странную вещь: когда я щелкаю по ячейкам, в которых их отображение должно было быть обновлено, происходит обновление.Это, конечно, происходит независимо от того, как я обновляюсь, когда кто-то нажимает на ячейку.

Я пытался сначала стереть то, что находится внутри ячейки, перед перерисовкой, но она все еще не работает.Работает ли делегат непрерывно в потоке, а функция живописца вызывается с индексом каждой ячейки в таблице?Я не понимаю, как обновление в ячейке, содержащей изображение, не обновляется автоматически, хотя художник должен был перерисовать область ячейки, и это происходит только после того, как был сделан щелчок по ячейке.Или, конечно, каждый раз к функции художника обращается новый художник?!

Ну, вот моя реализация функции делегата художника:

void Sphere::paint(QPainter *painter, const QStyleOptionViewItem &option,
                          const QModelIndex &index) const
 {
     if(tb1[index.row()][index.column()] == 1)
     {
         QImage Q1("Red Sphere.jpg");

     QRectF source(0.0, 0.0, 72.0, 70.0);

     painter->eraseRect(option.rect);

     if (option.state & QStyle::State_Selected)
             painter->fillRect(option.rect, option.palette.highlight());

     painter->drawImage(option.rect, Q1, source);

     }
     else if(tb1[index.row()][index.column()] == 2)
     {
         QImage Q1("Blue Sphere.jpg");

     QRectF source(0.0, 0.0, 72.0, 70.0);

     painter->eraseRect(option.rect);

     if (option.state & QStyle::State_Selected)
             painter->fillRect(option.rect, option.palette.highlight());


     painter->drawImage(option.rect, Q1, source);

     }
     else 
     {
         painter->eraseRect(option.rect);

         QStyledItemDelegate::paint(painter, option, index);
     }
  } 

Я могу дать вам любойбольше информации, если вам нужно решить мою проблему.Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 09 июня 2011

В соответствии с документацией QT

После покраски необходимо убедиться, что художник вернул его в состояние, в котором он находился при вызове этой функции.Например, может быть полезно вызвать QPainter :: save () перед рисованием и QPainter :: restore () после.

Я думаю, что вам не хватает save () и restore () методы QPainter в вашей функции.

1 голос
/ 08 июня 2011

Я также увидел странную вещь: когда я щелкаю по ячейкам, в которых их отображение должно было быть обновлено, происходит обновление.

Я думаю, что вы должны определить, на какие ячейки ведьмы влияют изменения, внесенные пользователем в текущую ячейку, и принудительно заставить эти ячейки update(). Когда вы об этом думаете, ваш делегат может проверить, изменяется ли содержимое tb1, чтобы автоматически решить перерисовать ячейку, которой он принадлежит.

EDIT

Простой способ сделать это - подключить слот к clicked ( const QModelIndex & index ), а затем определить, что нужно изменить, и вызвать метод update ( const QModelIndex & index ) ...

...