QTableWidget随机加载效率低下 - C ++

时间:2013-07-11 11:00:54

标签: c++ qt

我的函数loadRandomly()非常低效,20x15需要大约3-4秒。 在MyTableWidget构造函数中,我设置了srand((unsigned)time(0))

如果我不重新分配QTableWidgetItems(如果已经存在的话),我也不明白为什么它如此缓慢。

void MyTableWidget::loadRandomly()
{
    for(int i=0; i<this->rowCount(); i++)
        for(int j=0; j<this->columnCount(); j++){
            int randomN = minNum + (int)rand()/((int)RAND_MAX/(maxNum-minNum));
            if(!item(i,j)){
                setItem(i,j, new QTableWidgetItem(QString::number(randomN)));
                qDebug() << "MyTableWidget::loadRandomly() item created at " << i << " " << j;
            }
            else
                item(i,j)->setText(QString::number(randomN));
        }
}

1 个答案:

答案 0 :(得分:2)

我刚看了Qt Implementation(Qt 4.8)

Constructing an item很简单,不需要任何时间。

然而,inserting an item似乎过度耗时,一目了然,{em> view->isSortingEnabled()的情况。

所以我建议您尝试在方法开头调用setSortingEnabled(false),然后在结尾处调用setSortingEnabled(true)(如有必要)。

在检查文档后,我意识到他们实际上给出了相同的建议:

  

如果要设置特定行的多个项目(例如,通过在循环中调用setItem()),您可能希望在执行此操作之前关闭排序,然后将其重新打开;这将允许您对同一行中的所有项使用相同的行参数(即setItem()不会移动该行)。

修改

我无法重现这个问题。尝试以下最小的可编译示例(MCE)并告诉我输出是什么。如果它超过几毫秒,那么这意味着您的配置有问题。如果它小于几毫秒,则意味着代码中的其他地方出现了问题:尝试通过删除代码的一小部分来解决问题,直到问题消失(最终,因为代码会收敛)到没有重现问题的MCE。)

<强>的main.cpp

#include <QtGui>
#include "MyTableWidget.h"

int main(int argc, char ** argv)
{
    QApplication app(argc, argv);

    // layout
    QVBoxLayout * layout = new QVBoxLayout();

    // button
    QPushButton * button = new QPushButton("Load randomly");
    layout->addWidget(button);

    // table widget
    int numRow = 20;
    int numCol = 15;
    MyTableWidget * table = new MyTableWidget(numRow, numCol);
    layout->addWidget(table);

    // clicking on button load the table
    QObject::connect( button, SIGNAL(clicked()),
                table, SLOT(loadRandomly()) );

    // exec application
    QWidget * w = new QWidget();
    w->setLayout(layout);
    w->show();
    return app.exec();
}

<强> MyTableWidget.h

#include <QtGui>

class MyTableWidget: public QTableWidget
{
    Q_OBJECT

public:
    MyTableWidget(int r, int c) : QTableWidget(r, c) {}

public slots:
    void loadRandomly()
    {
        QElapsedTimer timer;
        timer.start();

        int minNum = 1;
        int maxNum = 99;
        for(int i=0; i<rowCount(); i++)
        for(int j=0; j<columnCount(); j++)
        {
            int randomN = minNum + (int)rand()/((int)RAND_MAX/(maxNum-minNum));
            if(!item(i,j))
            {
                setItem(i,j, new QTableWidgetItem(QString::number(randomN)));
                qDebug() << "item created at " << i << " " << j;
            }
            else
                item(i,j)->setText(QString::number(randomN));
        }

        qDebug() << "The slow operation took" << timer.elapsed() << "milliseconds";
    }
};

<强>输出

首先点击:

item created at  0   0
// ...
item created at  19   14 
The slow operation took 5 milliseconds 

第二次点击:

The slow operation took 1 milliseconds 

您的代码存在潜在问题

您已将表格小部件的某些信号连接到其他一些插槽,执行这些插槽需要花费大量时间(可能间接地通过触发可重新绘制()小部件的其他插槽来实现。