gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:16:44 24 4
gpt4 key购买 nike

我的函数 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));
}
}

最佳答案

我刚刚查看了 Qt Implementation (Qt 4.8)

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

然而,inserting an item乍一看,似乎过度耗时,view->isSortingEnabled() 为 true 的情况下

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

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

If you want to set several items of a particular row (say, by calling setItem() in a loop), you may want to turn off sorting before doing so, and turn it back on afterwards; this will allow you to use the same row argument for all items in the same row (i.e. setItem() will not move the row).

编辑

我无法重现该问题。尝试以下最小可编译示例 (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 

您的代码可能存在问题

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

关于c++ - QTableWidget 随机加载效率低下 - C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17591635/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com