我的函数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));
}
}
答案 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
您的代码存在潜在问题
您已将表格小部件的某些信号连接到其他一些插槽,执行这些插槽需要花费大量时间(可能间接地通过触发可重新绘制()小部件的其他插槽来实现。