我的函数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));
}
}发布于 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
#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 您的代码存在潜在问题
您已经将表小部件的一些信号连接到其他一些插槽,并且执行这些插槽需要很多时间(可能是间接地,通过触发其他可能重新绘制()小部件的插槽)。
https://stackoverflow.com/questions/17591635
复制相似问题