QListView обтекает очень медленно

Я хочу иметь представление в виде списка, как в проводнике Windows: данные отображаются в столбцах. Поэтому я установил QListView с кодом ниже. Выглядит абсолютно так же (см фото).

Но есть один существенный недостаток: при изменении размера окна перенос выполняется очень медленно. Напротив, файловый браузер Windows работает очень быстро.

Как ускорить перенос в QListView?

введите здесь описание изображения

h:

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
protected:
    void resizeEvent(QResizeEvent *);
private:
    Ui::MainWindow *ui;
};

цена за тысячу показов:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QStandardItemModel* m=new QStandardItemModel;
    for (int i=100;i<1000;++i){
        m->insertRow(i-100,new QStandardItem(QString::number(i).repeated(5)+"   "));
    }
    ui->listView->setModel(m);
    ui->listView->setWrapping(true);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::resizeEvent(QResizeEvent *e)
{
    QMainWindow::resizeEvent(e);
    ui->listView->setWrapping(ui->listView->isWrapping());
}

person user2366975    schedule 26.01.2016    source источник


Ответы (2)


Я попробовал ваш код под Linux с Qt 5.5.1, и упаковка выполняется быстро и мгновенно. Какую версию Qt вы используете? Qt 4.x имеет некоторые проблемы с производительностью под Windows.

Вы можете ускорить процесс с помощью NoAntialias

QFont fnt;
fnt.setStyleStrategy(QFont::NoAntialias);
ui->listView->setFont(fnt);

Если ваш список становится больше, и вы не хотите вставлять новые данные, вы получите плохую производительность. Вам следует избегать QStandardItemModel для больших наборов данных.

person gj13    schedule 27.01.2016
comment
Я использую Qt 5.3. Я попробовал свое основное приложение большего размера с Qt 5.5 (обновленным с Qt 5.2), но некоторые вещи были мучительно медленными (тот же код). Поэтому я установил Qt 5.3, в котором была функция, которую я хотел использовать (первоначальная мотивация для обновления версии). Тем не менее, я сделал тест с Qt 5.5 сейчас, и это тоже не было мгновенным. Также «NoAntialias» не привел к каким-либо улучшениям :( - person user2366975; 28.01.2016
comment
Теперь я также попробовал очень простую пользовательскую модель (уже не QStandardItemModel), но результат не ускорился. - person user2366975; 28.01.2016

Вам не нужно устанавливать перенос каждый раз, когда размер виджета изменяется. Qt ищет свойство isWrapping при изменении размера и решает, нужен ли новый сегмент. Вам просто нужно установить свойство flow LeftToRight или TopToBottom и свойство isWrapping один раз при создании виджета. Удалите код из файла resizeEvent. Также вы можете посмотреть на свойство layoutMode для целей производительности.

person Ani    schedule 28.11.2016