gpt4 book ai didi

c++ - 为什么 QPainter 在 QAbstractItemView::dataChanged 中不工作?

转载 作者:行者123 更新时间:2023-11-28 04:55:31 24 4
gpt4 key购买 nike

我在 QT 中使用过模型/ View 。我已经构建了一个自定义 QAbstractItemView View 。正如我所知,虽然我从模型中设置的数据已更改,但 QAbstractItemView::dataChanged 将被调用。所以我想在数据更改后写一个矩形。代码如下。构建 View 后计时器更改数据时没有发生任何事情(我不在模型中设置初始数据,只是在构建 View 后由计时器设置)。但是,当我在模型中设置初始数据时在职的?为什么?

最佳答案

一个可能的原因是,在您从 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com