我在QT中使用过模型/视图。我建立了一个自定义的QAbstractItemView视图。据我所知,虽然我从模型设置的数据已更改,但将调用QAbstractItemView :: dataChanged。因此,我想在数据已更改时编写一个rect。代码如下。构建视图后,通过计时器更改数据的过程没有发生任何事情(我没有在构建视图后通过计时器设置的模型中设置初始数据)。但是,当我在模型中设置初始数据时,工作吗为什么?

最佳答案

一个可能的原因是,在您从QImage对象创建QPixmap时,QPainter的更改尚未全部刷新到QPixmap中。可以这样尝试:

void View::dataChanged(const QModelIndex &topLeft,
                  const QModelIndex &bottomRight,
                  const QVector<int> &)
{
   QAbstractItemView::dataChanged(topLeft, bottomRight);

   QImage img(QSize(250, 100), QImage::Format_RGBA8888);

   {
     QPainter painter(&img);
     painter.setPen(Qt::red);
     painter.setBrush(Qt::blue);
     painter.drawRect(10, 10, 50, 50);
   }

   a->setPixmap(QPixmap::fromImage(img));
   [...]


通过将QPainter放在单独的作用域中,我们强制QPainter的析构函数在调用setPixmap()之前运行,从而确保已将其所有更改都刷新到QImage对象中。 (或者,您可以在进行绘画调用之前调用painter.begin(&img),在完成之后调用painter.end(&img),但是我认为上述方法不太容易出错)

还要注意,我更改了要在堆栈上分配的QImage而不是使用new运算符,以便您不会在每次运行dataChanged方法时泄漏QImage对象。在C ++中,如果可能的话,您将避免使用new运算符,因为每次使用它时,您都必须记住之后何时调用delete;否则,您将难以诊断内存泄漏。

关于c++ - 为什么QPainter在QAbstractItemView::dataChanged中不起作用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47214478/

10-12 23:40