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();
}
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();
}