在 Qt C++ 中在自定义项委托上绘制文本时的性能问题
Performance issues when painting text on custom item delegates in Qt C++
>目标:使用要在 QListView 中使用的自定义文本内容创建项目委托。
问题:在重新实现 QAbstractItemDelegate 子类的paint()
方法时,使用 QPainter 绘制文本明显比绘制形状和像素图慢。将基类更改为 QStyledItemDelegate 不会提高速度。
设置:Qt 5.9.1,MSVC 2017,在Windows 7/10上测试
预研究:此处报告了类似的错误,但是在这种特殊情况下,即使不使用QPainter::setFont()
,性能问题也存在。 项目委托上的Qt示例没有多大帮助,因为它们展示了如何绘制控件,而不仅仅是文本。
示例:下面给出的示例说明了问题。显示应用程序的窗口后,QListView的内容会显示轻微但明显的延迟。在某些情况下,此延迟会持续几秒钟。当注释view->setItemDelegate(new Delegate(this));
或painter->drawText(0, option.rect.y() + 18, index.data().toString());
中的任何一个时,显示窗口和QListView的内容之间没有可观察到的延迟。
主窗口.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QListView>
#include <QStandardItemModel>
#include "Delegate.h"
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
};
#endif // MAINWINDOW_H
主窗口.cpp
#include "MainWindow.h"
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{
QStandardItemModel *model = new QStandardItemModel(this);
QListView *view = new QListView(this);
view->setModel(model);
view->setItemDelegate(new Delegate(this));
for (int n = 0; n < 100; n++) { model->appendRow(new QStandardItem("Test " + QString::number(n))); }
setCentralWidget(view);
}
Delegate.h
#ifndef DELEGATE_H
#define DELEGATE_H
#include <QAbstractItemDelegate>
#include <QPainter>
class Delegate : public QAbstractItemDelegate
{
Q_OBJECT
public:
explicit Delegate(QObject *parent = nullptr);
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;
QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const;
};
#endif // DELEGATE_H
委托.cpp
#include "Delegate.h"
Delegate::Delegate(QObject *parent) : QAbstractItemDelegate(parent)
{
}
void Delegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
painter->drawText(0, option.rect.y() + 18, index.data().toString());
painter->drawLine(0, option.rect.y() + 19, option.rect.width(), option.rect.y() + 19);
}
QSize Delegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
{
return QSize(0, 20);
}
现在我已经创建了一个错误报告。我将用我收到的任何进一步信息更新这篇文章。
相关文章:
- SFML 文本未绘制在窗口上
- QPainter 将 QBrush 设置为 在 QT/C++ 中绘制文本
- 绘制文本问题
- SFML 2.4.2 - 绘制文本时出现分段错误
- 在 Qt C++ 中在自定义项委托上绘制文本时的性能问题
- QTool按钮上的文本未绘制
- 如何在透视视图中绘制文本
- Qt:用不同的字体绘制文本
- Linux绘制文本模式(无GUI,桌面)
- 如何在MFC中一一绘制单独的文本
- 使用Glstipple时,Oglft绘制文本
- 绘制文本和文本剪辑
- 有效地在 QPainterPath 周围绘制文本
- DirectWrite GDI 互操作:使用"IDWriteFontFace"绘制文本的简单方法
- 如何从文本中绘制这些数据
- DrawStatustext仅在后续呼叫上不在第一次呼叫上绘制文本
- SFML 在绘制文本时崩溃
- QPainter 未正确绘制文本
- 将文本绘制到屏幕
- 如何使用 WinAPI 将文本绘制到字节数组