首页 > 解决方案 > 如何在视图上绘制?

问题描述

有一个模型,包含字符串和一个列表视图。

是的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();
}

checker.png 看起来像这样: 在此处输入图像描述

没有发生预期的事情 - 图片没有显示。该视图被描述为好像没有覆盖任何方法。并在控制台中打印以下内容:

在此处输入图像描述

实际结果:

在此处输入图像描述

我的期望:

在此处输入图像描述

那么,如何在视图中绘制呢?

标签: c++qtmodel-view

解决方案


继承自的所有项目视图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);
}

它还将消除您在控制台上看到的错误消息。


推荐阅读