首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QTableWidget随机负载低效- C++

QTableWidget随机负载低效- C++
EN

Stack Overflow用户
提问于 2013-07-11 19:00:54
回答 1查看 265关注 0票数 1

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

我不明白为什么如果我不重新分配已经存在的QTableWidgetItems,它也会这么慢。

代码语言:javascript
复制
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));
        }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-11 19:52:05

我刚刚看了一下Qt Implementation (Qt4.8)

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

然而,乍一看,似乎太耗时了,在view->isSortingEnabled()是真的的情况下。

因此,我建议尝试在方法开始时调用setSortingEnabled(false),然后在结束时调用setSortingEnabled(true) (如果需要)。

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

行如果您想设置特定行的几个项目(例如,通过在循环中调用setItem() ),您可能希望在执行此操作之前关闭排序,然后再打开它;这将允许您对同一行中的所有项目使用相同的

参数(即setItem()不会移动该行)。

编辑

我不能重现这个问题。尝试下面的最小可编译示例(MCE),并告诉我输出是什么。如果它比几毫秒长得多,那么就意味着你的配置有问题。如果不到几毫秒,这意味着代码中的其他地方有问题:尝试通过一点一点地删除代码来解决问题,直到问题消失(它最终会消失,因为您的代码将收敛到不会重现问题的MCE )。

main.cpp

代码语言:javascript
复制
#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

代码语言:javascript
复制
#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";
    }
};

输出

第一次点击:

代码语言:javascript
复制
item created at  0   0
// ...
item created at  19   14 
The slow operation took 5 milliseconds 

第二次单击:

代码语言:javascript
复制
The slow operation took 1 milliseconds 

您的代码存在潜在问题

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17591635

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档