首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么QPainter不能在QAbstractItemView::dataChanged中工作?

为什么QPainter不能在QAbstractItemView::dataChanged中工作?
EN

Stack Overflow用户
提问于 2017-11-10 01:50:16
回答 2查看 122关注 0票数 0

我在QT中使用了模型/视图。我已经构建了一个定制的QAbstractItemView视图。正如我所知道的,虽然我从模型中设置的数据已经被更改,但是QAbstractItemView::dataChanged将被调用。所以我想在数据被更改的时候写一个rect。代码如下。当数据在视图生成后被计时器更改时(我没有在模型中设置初始数据,只是在视图生成后由计时器设置).However,而我在模型中设置的初始数据是否正常工作时,什么都没有发生。为什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-10 02:25:36

一个可能的原因是,在从您的QPixmap对象创建QImage时,QPainter的更改还没有全部流到QPixmap中。试着这样做吧:

代码语言:javascript
复制
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++中,如果可能的话,您将希望避免使用新的操作符,因为每次使用它时,您都必须记住何时调用delete,如果不使用,则会遇到难以诊断的内存泄漏。

票数 1
EN

Stack Overflow用户

发布于 2017-11-10 02:36:35

首先,确保模型数据确实发生了变化。最简单的方法是在那里使用qDebug()

代码语言:javascript
复制
#include <QDebug>
...
void View::dataChanged(const QModelIndex &topLeft,
              const QModelIndex &bottomRight,
              const QVector<int> &)
{
     qDebug() << "View::dataChanged is called" ;
...

因为QAbstractItemModel::setData完全可以返回false而不发出dataChanged信号。

如果它是由您实现的非标准模型,请确保您实现了setData,它发出dataChanged信号。

此外,如果编辑设置相同的值,则模型不发出dataChanged是正确的行为。以下是一些典型的模型行为。

代码语言:javascript
复制
setData(index, 1); // emitted
setData(index, 1); // nothing changed - dataChanged not emitted
setData(index, 1); // nothing changed - dataChanged not emitted
setData(index, "hello"); // false returned. Should be a number. dataChanged not emitted
setData(index, 2); // emitted
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47214478

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档