我刚刚看了一下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
您的代码的潜在问题
您已将表格小部件的一些信号连接到其他一些插槽,并且执行这些插槽需要大量时间(可能是间接地,通过触发可能重新绘制()小部件的其他插槽)。