1

我的功能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));
        }
}
4

1 回答 1

2

我刚刚看了一下Qt 实现(Qt 4.8)

构建一个项目很简单,不需要任何时间。

但是,插入一个项目似乎过于耗时,乍一看,在这种情况下view->isSortingEnabled()是真的

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

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

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

编辑

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

主文件

#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 

您的代码的潜在问题

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

于 2013-07-11T11:52:05.327 回答