, Я буду обновлять этот пост с любой дополнительной информацией, которую я получу.

 Создание делегата элемента с пользовательским текстовым содержимым для использования вQListView.

Проблема: Рисование текста сQPainter в повторной реализацииpaint() методQAbstractItemDelegateПодкласс заметно медленнее, чем рисование фигур и растровых изображений. Изменение базового класса на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.

mainwindow.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

mainwindow.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

delegate.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);
}

Ответы на вопрос(0)

Ваш ответ на вопрос