PDA

View Full Version : Spread of reading data with QTableWidget and QTableView



xiongxiongchuan
26th June 2010, 07:22
hi ,i use the QTableWidget to read data form csv files but i found that the speed is very slow ,so i inhert a widget form QTableView and use the model to add data but i did't see any improvement;


gridview.h

#ifndef GRIDVIEW_H
#define GRIDVIEW_H

#include <QTableView>
#include <QStandardItemModel>

class QStandardItemModel;
class QTableModel;

class GridView : public QTableView
{
Q_OBJECT

public:
GridView(QWidget *parent);
~GridView();

QString currentLocation() const;
QString currentText() const;
int currentRow() const;
int currentColumn() const;
void clear();
void setText(int row,int colum,const QString &text);
QString text(int row,int column);
QItemSelectionRange selectedRange() const;
QList<QStandardItem*> selectedItems();
QString isNumber(bool& checkResult);
void setRowCount(int row);
void setColumnCount(int column);

int rowsCount()
{
return rowCount;
}

int columnCount()
{
return columnsCount;
}



public slots:
void cut();
void copy();
void paste();
void del();
void selectCurrentRow();
void selectCurrentColumn();
QString statistics(bool& convertSucess);




signals:
void modified();

private slots:
void rowsHandle(int rowAction);
void columnsHandle(int columnAction);


private:

QStandardItemModel *model;
int rowCount;
int columnsCount;

void updateGridHeader();

};

#endif // GRIDVIEW_H



gridview.cpp

#include "gridview.h"
#include <QtGui>
#include "cell.h"
#include <gsl/gsl_statistics.h>
#include <QStandardItem>

GridView::GridView(QWidget *parent)
: QTableView(parent)
{



model=new QStandardItemModel(this);
this->setModel(model);
updateGridHeader();

QScrollBar* vscroll=this->verticalScrollBar();
if (vscroll)
{
connect(vscroll,SIGNAL(actionTriggered(int)),this, SLOT(rowsHandle(int)));
}

QScrollBar *hscroll=this->horizontalScrollBar();
//æ·»åŠ åˆ—
if (hscroll)
{
connect(hscroll,SIGNAL(actionTriggered(int)),this, SLOT(columnsHandle(int)));
}
clear();

}

GridView::~GridView()
{

}

void GridView::clear()
{
rowCount=50;
columnsCount=20;


model->setRowCount(rowCount);
model->setColumnCount(columnsCount);

}
QString GridView::currentLocation() const
{


int row=this->currentIndex().row();
int column=this->currentIndex().column();

int c=column/26;
QString text=QString(QChar('A' + column%26));
if (c>0)
{
text=QString(QChar('A'+(c-1)));
text+=QString(QChar('A' + column%26));
}


text+=QString::number(row,10);


return text;

}

QString GridView::currentText() const
{
int row=this->currentIndex().row();
int column=this->currentIndex().column();

QStandardItem* item=model->item(row,column);

if (item)
{
item->data( Qt::DisplayRole).toString();
}
else
{
return "";
}


}
void GridView::setText(int row,int colum,const QString &text)
{
QStandardItem *itemID = new QStandardItem(text);//QString::number(j)));
model->setItem(row,colum,itemID);
}
void GridView::selectCurrentColumn()
{
selectColumn(currentIndex().column());

}

void GridView::selectCurrentRow()
{
selectRow(currentIndex().row());

}
void GridView::updateGridHeader()
{

for (int i=0;i<model->columnCount();i++)
{
int c=i/26;

QString text=QString(QChar('A'+(i)%26));
if (c>0)
{
text=QString(QChar('A'+(c-1)));
text+=QString(QChar('A' + (i)%26));
}

model->setHeaderData(i,Qt::Horizontal,text);

}
}


QItemSelectionRange GridView::selectedRange() const
{
const QList<QItemSelectionRange> ranges = selectionModel()->selection();
return ranges.first();


}

QString GridView::text(int row,int column)
{
QStandardItem* item=model->item(row,column);

if (item)
{
item->data( Qt::DisplayRole).toString();
}
else
{
return "";
}

}
QList<QStandardItem*> GridView::selectedItems()
{
QModelIndexList indexes = selectionModel()->selectedIndexes();
QList<QStandardItem*> items;
for (int i = 0; i < indexes.count(); ++i) {
QModelIndex index = indexes.at(i);
if (isIndexHidden(index))
continue;
QStandardItem *item =model->item(index.row(),index.column());
if (item)
items.append(item);
}
return items;


}
void GridView::cut()
{
copy();
del();


}
void GridView::paste()
{
QItemSelectionRange range=selectedRange();
QString str = QApplication::clipboard()->text();
str=str.trimmed();
QStringList rows = str.split('\n');
int numRows = rows.count();
int numColumns = rows.first().count('\t') + 1;

if ((range.top()+numRows)>rowCount)
{
model->setRowCount(range.top()+numRows);
}
if ((range.left()+numColumns)>columnsCount)
{
model->setRowCount(range.left()+numColumns);
}

updateGridHeader();

if (range.height() * range.width() != 1&& (range.height() != numRows|| range.width() != numColumns)) {
QMessageBox::information(this, tr("Spreadsheet"),
tr("The information cannot be pasted because the copy "
"and paste areas aren't the same size."));
return;
}

for (int i = 0; i < numRows; ++i)
{
QStringList columns = rows[i].split('\t');
for (int j = 0; j < numColumns; ++j)
{
int row = range.top() + i;
int column = range.left() + j;


if (row < rowCount&& column<columnsCount)
{
setText(row, column, columns[j]);
}
}
}






}
void GridView::copy()
{
QItemSelectionRange range=selectedRange();
QString str;

for (int i=0;i<range.height();i++)
{
if (i>0)
{
str+="\n";
for (int j=0;j<range.width();j++)
{
if (j>0)
{
str+="\t";
str+=text(range.top()+i,range.left()+j);
}
}
}

}

QApplication::clipboard()->setText(str);


}
void GridView::del()
{
QList<QStandardItem *> items = selectedItems();
if (!items.isEmpty())
{
foreach (QStandardItem *item, items)
delete item;
}

}
void GridView::columnsHandle(int columnAction)
{
if (columnAction==QAbstractSlider::SliderSingleStepAd d)
{
if (this->horizontalScrollBar()->value()==this->horizontalScrollBar()->maximum())
{
int count=model->columnCount()+1;
model->setColumnCount(count);
}
}
updateGridHeader();
}

void GridView::rowsHandle(int rowAction)
{
if (rowAction==QAbstractSlider::SliderSingleStepAdd)
{
if (this->verticalScrollBar()->value()==this->verticalScrollBar()->maximum())
{
int count=model->rowCount()+1;
model->setRowCount(count);
}
}
}

QString GridView::isNumber(bool& checkResult)
{
QString retrunReport;
QList<QStandardItem*> selecteditem=selectedItems();

QList<double> castedNumber;

for (int i=0;i<selectedItems().size();i++)
{
bool castSuccess=true;

double castedDouble=selecteditem[i]->text().toDouble(&castSuccess);
if (!castSuccess)
{
retrunReport+=QString("The Item of [<font color=red>%1</font>,<font color=red>%2</font>] is not a number; <br>").arg(selecteditem[i]->row()+1).arg(selecteditem[i]->column()+1);
checkResult=false;
}
else
{
castedNumber+=castedDouble;
}
}

return retrunReport;

}

QString GridView:: statistics(bool& convertSucess)
{
QString retrunReport;
/*retrunReport=+(new QDateTime)->toString(Qt::DateFormat::ISODate);
retrunReport=+"<br>";*/

QList<QStandardItem*> selecteditem=selectedItems();
if (selecteditem.size()==0)
{
retrunReport+=tr("There isn't any selected items existed.<br>");
convertSucess=false;
}
QList<double> castedNumber;

for (int i=0;i<selectedItems().size();i++)
{
bool castSuccess=true;

double castedDouble=selecteditem[i]->text().toDouble(&castSuccess);
if (!castSuccess)
{
retrunReport+=QString("<font color=red>ERROR</font> The Item of [<font color=red>%1</font>,<font color=red>%2</font>] is not a number; <br>").arg(selecteditem[i]->row()+1).arg(selecteditem[i]->column()+1);
}
else
{
castedNumber+=castedDouble;
}
}

double *statsticNumber=new double[castedNumber.size()];

for (int i=0;i<castedNumber.size();i++)
{
statsticNumber[i]=castedNumber[i];
}
if (castedNumber.size()>0)
{
retrunReport+=QString("The <font color=blue><strong>mean</strong></font> of these number is : <font color=red><strong>%1</strong></font><br />").arg(gsl_stats_mean(statsticNumber,1,castedNumber .size()));
}


delete statsticNumber;
return retrunReport;


}

void GridView::setColumnCount(int column)
{
model->setColumnCount(column);


}

void GridView::setRowCount(int row)
{
model->setRowCount(row);

}

int GridView::currentRow() const
{
return currentIndex().row();

}

int GridView::currentColumn() const
{
return currentIndex().column();


}

Lykurg
26th June 2010, 09:50
you can't see any improvements since QTableWidget uses a QStandardItemModel internal too. So there is no difference. Better use your own custom model, then you will probably see more efficiency. For a hint see QxtCsvModel (http://doc.libqxt.org/0.6.0/qxtcsvmodel.html).

xiongxiongchuan
26th June 2010, 10:17
i have create a mode and insert data like this ,but it is still very slow model->setItem(i, 13, new QStandardItem("14"));
table->setModel(model);