1

我在交互式棋盘游戏的实现中使用了 QTableView。图像将显示在表格的单元格中。我正在使用带有绘制函数的 QStyledItemDelegate 在表格单元格内绘制图像。

由于图像应仅在表格的某些单元格中显示并在用户单击表格单元格时更新,因此使用与表格具有相同尺寸的双整数数组。根据数组的值,画家应该在表格的特定单元格中绘制图像。最初,表格的 4 个单元格内只有 4 个图像,当用户单击表格中的一个单元格时,数组会更新,这意味着应该更改表格单元格内绘制和显示的内容。

通常,用户单击已成功更新的空(白色)单元格,并且特定图像会显示在单元格中。但是,如果存在其他包含图像且应更新的单元格,则不会显示更新,尽管更新了双整数数组。我还看到了一件奇怪的事情,那就是当我点击应该更新其显示的单元格时,就会发生更新。这当然会发生,无论当有人单击单元格时我如何更新。

我试图在重绘之前先擦除单元格内的内容,但它仍然无法正常工作。委托是否在线程中连续运行,并且使用表中每个单元格的索引调用画家函数?我不明白包含图像的单元格的更新如何不会自动更新,尽管画家应该重新绘制单元格的区域并且它仅在单击单元格后才会发生。还是每次都会调用一个新的painter到painter的函数?!

好吧,这是我对委托的画家功能的实现:

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);
     }
  } 

如果您需要解决我的问题,我可以为您提供更多信息。提前致谢。

4

2 回答 2

1

我还看到了一件奇怪的事情,那就是当我点击应该更新其显示的单元格时,就会发生更新。

我认为你必须确定女巫细胞受到用户在当前细胞中所做的改变的影响,并强制这些细胞改变update()。当您想到它时,您的委托可以检查tb1更改的内容是否自动决定重新绘制它所属的单元格。

编辑

一种简单的方法是,将一个插槽连接到clicked ( const QModelIndex & index )then 在此处确定更改并调用该update ( const QModelIndex & index )方法...

于 2011-06-08T16:12:23.253 回答
1

根据QT 文档

绘制后,您应该确保绘制器返回到调用此函数时提供的状态。例如,在绘画之前调用 QPainter::save() 和之后调用 QPainter::restore() 可能很有用。

我认为您在函数中缺少QPainter 的save()restore()方法。

于 2011-06-09T06:15:24.060 回答