c++ - 如何在视图上绘制?
问题描述
有一个模型,包含字符串和一个列表视图。
是的QListView
后代QPaintDevice
,因此您可以在其中覆盖paintEvent (QPaintEvent *)
并在其上绘制一些东西。例如,您需要绘制图像cheker.png:
#include <QApplication>
#include <QPainter>
#include <QPaintEvent>
#include <QListView>
#include <QStringListModel>
class View :public QListView {
public:
void paintEvent(QPaintEvent* event) {
QListView::paintEvent(event);
QPainter painter(this);
painter.drawPixmap(10,10,QPixmap("cheker.png"));
}
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QStringListModel model;
QStringList list;
list << "a" << "b" << "c" << "d" << "e" << "f" << "g" << "h";
model.setStringList(list);
View view;
view.setModel(&model);
view.show();
return a.exec();
}
没有发生预期的事情 - 图片没有显示。该视图被描述为好像没有覆盖任何方法。并在控制台中打印以下内容:
实际结果:
我的期望:
那么,如何在视图中绘制呢?
解决方案
继承自的所有项目视图QAbstractScrollArea
都有些棘手,因为列表视图本身通常不是绘制的小部件。派生自的视图QAbstractScrollArea
将具有通常绘制的视口小部件。见:QAbstractScrollArea::viewport()
。
要绘制图像,您可以paintEvent()
通过让画家将视口小部件作为绘制设备来更改实现以在视口小部件上进行绘制。以下将在列表视图中的项目上绘制一条红线:
void paintEvent(QPaintEvent* event) override
{
QListView::paintEvent(event);
QPainter painter(viewport());
painter.setPen(Qt::red);
painter.drawLine(0, 0, 100, 100);
}
它还将消除您在控制台上看到的错误消息。
推荐阅读
- java - 当我在 docker 中启动 helloWorld.java 时出错
- python - 编码挑战字符串方法 Python
- arrays - 蜂巢poseexplode地图数据类型
- html - 背景颜色不会改变 CSS 样式表
- java - 在静态方法中调用非静态方法
- android - Android LiveData 和提供者/管理器模式
- dictionary - 如何在go中为哈希映射制作复合键
- java - 在 diskIO().execute 方法上检查 Empty Edittext
- python-3.x - 填充一个 NxM 矩阵,使得 A[i,j]=A[i-1,j] NAND A[i,j-1]
- clojure - 对向量使用过滤器