单击表格单元格后,QtableView 中的某些单元格不会自动重绘

Posted

技术标签:

【中文标题】单击表格单元格后,QtableView 中的某些单元格不会自动重绘【英文标题】:Some cells in QtableView are not repainted automatically after a clicking on a table cell 【发布时间】:2011-06-08 15:44:15 【问题描述】:

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

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

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

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

嗯,下面是我对delegate的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);
     
   

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

【问题讨论】:

【参考方案1】:

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

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

编辑

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

【讨论】:

我为每个应该更新的单元格调用了 update ( const QModelIndex & index ),但它仍然无法正常工作 我明白了。我在开始时(第一行)在委托的画家函数中调用了 update(const QModelIndex & index) 并且它起作用了。不确定这是否是最好的方法,但它确实有效。感谢您的帮助。 @Muaz 我认为这个答案最有用的部分是在你的最后一条评论中!【参考方案2】:

根据QT Documentation

画完后,你应该确保 画家回到了它的 说明它是在什么时候提供的 函数被调用。例如,它 调用 QPainter::save() 可能很有用 在绘画之前和 QPainter::restore() 之后。

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

【讨论】:

以上是关于单击表格单元格后,QtableView 中的某些单元格不会自动重绘的主要内容,如果未能解决你的问题,请参考以下文章

单击qTableWidget pyqt5中的特定单元格后,特定单元格的背景颜色没有改变

在 QTableView 中编辑单元格后使用 TAB 键前进时如何避免编辑模式?

excel合并单元格后怎么边框线没了?

QTableView 中标题单元格中的复选框

触摸表格视图中的单元格后标签栏消失

DataTables DT:重置单击单元格的值