【问题标题】:QListView wrapping very slowQListView 包装很慢
【发布时间】:2016-01-26 23:06:27
【问题描述】:

我想要一个列表视图,就像 Windows 文件资源管理器中的一样:数据显示为列。所以我用下面的代码设置了一个QListView。 它看起来完全一样(见图)。

但有一个主要缺点:调整窗口大小时,换行速度很慢。相反,Window的文件浏览器非常快。

如何加快 QListView 中的包装速度?

h:

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

cpp:

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

【问题讨论】:

    标签: qt qlistview


    【解决方案1】:

    我在 Linux 下使用 Qt 5.5.1 尝试了您的代码,并且包装快速且即时。 你用的是什么Qt版本? Qt 4.x 在 windows 下存在一些性能问题。

    您可以使用NoAntialias 加快速度

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

    如果您的列表变得更大并且您不想插入新数据,那么您的性能会很差。对于大型数据集,您应该避免使用 QStandardItemModel。

    【讨论】:

    • 我使用的是 Qt 5.3。我用 Qt 5.5(从 Qt 5.2 升级)尝试了我更大的主应用程序,但有些事情非常缓慢(相同的代码)。所以我安装了具有我想要使用的功能的 Qt 5.3(版本升级的初始动机)。但是,我现在用 Qt 5.5 进行了测试,也不是即时的。此外,“NoAntialias”并没有带来任何改进:(
    • 现在我也尝试了一个非常简单的自定义模型(不再是QStandardItemModel),但结果并没有加快。
    【解决方案2】:

    您无需在每次调整小部件大小时都设置换行。 Qt 在调整大小时寻找isWrapping 属性并决定是否需要新段。您只需要在创建小部件时设置一次flow 属性LeftToRightTopToBottomisWrapping 属性。从resizeEvent 中删除代码。 您还可以查看layoutMode 属性以了解性能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-18
      • 2015-12-03
      • 1970-01-01
      • 2017-04-14
      • 2011-11-21
      • 1970-01-01
      相关资源
      最近更新 更多