为什么 QPainter 在 QAbstractItemView::d ataChanged 中不起作用
why QPainter is not working in QAbstractItemView::dataChanged?
我在QT中使用了模型/视图。我已经构建了一个自定义的QAbstractItemView视图。据我所知,虽然我从模型设置的数据已被更改,但将调用QAbstractItemView::d ataChanged。所以我想在数据更改时写一个矩形。代码如下。在构建视图后,计时器更改了数据时,什么也没发生(我不会在构建视图后由计时器设置的模型中设置初始数据(。但是,当我在模型中设置初始数据时是否正常工作?为什么?
一个可能的原因是,在你从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
,如果不这样做,你会得到一个难以诊断的内存泄漏。
首先,确保模型数据确实发生了变化。最简单的方法是在那里使用qDebug()
。
#include <QDebug>
...
void View::dataChanged(const QModelIndex &topLeft,
const QModelIndex &bottomRight,
const QVector<int> &)
{
qDebug() << "View::dataChanged is called" ;
...
因为QAbstractItemModel::setData
可以只返回false
而不发出dataChanged
信号。
如果是您实现的非标准模型,请确保您实施了发出dataChanged
信号的setData
。
此外,如果编辑设置相同的值,则模型不发出dataChanged
是正确的行为。以下是一些典型的模型行为。
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
- 我的神经网络不起作用 [XOR 问题]
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- C++为什么尽管我调用了void函数,它却不起作用
- 为什么在保护模式下继承升级不起作用
- 循环在计数器中不起作用
- 在其他文件中创建类时在 c++ 项目中不起作用
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 为什么二进制搜索在我的测试中不起作用
- 我的代码中有错误吗?使用BGI图形的C++代码对我不起作用
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 带有指定长度字符* 参数的 std::regex_search 在 VS2017 中不起作用?
- Bjarne Stroustrup Book - std_lib_facilities.h - 不起作用(未知类型名称)
- 为什么简单的算术减法在"if"条件下不起作用?
- 为什么Stroustup书中的has_f不起作用
- 你能检查一下为什么在这个代码中从链接列表中删除项目不起作用吗
- 嵌套While循环不起作用(C++问题)
- C++Matching Brackets 2解决方案不起作用
- 为什么这段代码不起作用,我该如何解决?
- 为什么 QPainter 在 QAbstractItemView::d ataChanged 中不起作用