How to save a treeview as .csv file in Qt?
-
I need to save the current view of my QTreeView (QSortFilterProxyModel and QStandardItemModel) as a .csv file. Unfortunately, I don't know where to start...
My code only prints the parent (root) items. I need to print both parents and their children.
I think this can be solved by recursion, but I am not sure how... Any ideas?My treeview:
http://i.imgur.com/R9rvPDh.png
My code:
QFile file(filePath); if (file.open(QFile::WriteOnly)) { QTextStream stream(&file); for (int i = 0; i < proxyModel->rowCount(); i++) { QModelIndex index0 = proxyModel->index(i, 0); QModelIndex index1 = proxyModel->index(i, 1); QModelIndex index2 = proxyModel->index(i, 2); QModelIndex index3 = proxyModel->index(i, 3); QModelIndex index4 = proxyModel->index(i, 4); stream << proxyModel->data(index0).toString() << "," << proxyModel->data(index1).toString() << "," << proxyModel->data(index2).toString() << "," << proxyModel->data(index3).toString() << "," << proxyModel->data(index4).toString(); stream << "\n"; } file.close(); }
Ouput:
(0008,0005),SpecificCharacterSet,CS,10,ISO_IR 100 (0008,0008),ImageType,CS,36,ORIGINAL\PRIMARY\M\HEADER_CORRECTED (0008,0016),SOPClassUID,UI,26,1.2.840.10008.5.1.4.1.1.4 (0008,0018),SOPInstanceUID,UI,46,1.3.12.2.1107.5.2.5.11090.5.0.5823661031981777 (0008,0020),StudyDate,DA,8,20040305 (0008,0021),SeriesDate,DA,8,20040305 (0008,0022),AcquisitionDate,DA,8,20040305 (0008,0023),ContentDate,DA,8,20040305 (0008,0030),StudyTime,TM,14,085922.859000 (0008,0031),SeriesTime,TM,14,090019.359000 (0008,0032),AcquisitionTime,TM,14,085939.762492 (0008,0033),ContentTime,TM,14,090021.062000 (0008,0050),AccessionNumber,SH,2,0 (0008,0060),Modality,CS,2,MR (0008,0070),Manufacturer,LO,8,SIEMENS (0008,0080),InstitutionName,LO,18,cJf7JCqV84P^te1az (0008,0090),ReferringPhysicianName,PN,20,FLp8xklEDWOqavQWiJ9 (0008,1010),StationName,SH,8,unknown (0008,1030),StudyDescription,LO,12,WRIST^RIGHT (0008,103e),SeriesDescription,LO,18,SCOUT 3-PLANE RT. (0008,1070),OperatorsName,PN,14,RIORDAN, JAMES
-
void someFunction() { QFile file(filePath); if (file.open(QFile::WriteOnly)) { QTextStream stream(&file); this->printTree( 0, QModelIndex(), stream ); file.close(); } }
void printTree( int level, const QModelIndex & index, QTextStream & stream ) { QString indent; for( int j = 0; j < level; ++j ) indent.append( " " ); // print index itself if( index.isValid() ) { stream << indent; for( int c = 0; c < index.model()->columnCount(index.parent()); ++c ) { QModelIndex columnIndex = index.sibling(index.row(), c); stream << index.data().toString(); } stream << "\\n"; } //print children for (int r = 0; r < index.model()->rowCount(index); r++) { const QModelIndex childIndex = index.child( r, 0 ); this->printTree( level+1, childIndex, stream ); } }
No guarantee that it works - wrote it straight down from my head - but i hope it gives you an idea, how the recursion can be done.
-
Thank you very much for your effort, but I have still a question...
How do I use this on my proxyModel?NEVERMIND, I FOUND THE MISTAKE :)
for( int c = 0; c < index.model()->columnCount(index.parent()); c++) { QModelIndex columnIndex = index.sibling(index.row(), c); stream << index.data().toString(); }
SHOULD BE:
for( int c = 0; c < index.model()->columnCount(index.parent()); c++) { QModelIndex columnIndex = index.sibling(index.row(), c); stream << columnIndex .data().toString(); }
THANK YOU SOOOO MUCH FOR YOUR HELP!! I cannot believe how you can get up with this, without trying :) I am new in the Qt world and one day I wil also be experienced as you.. :P
-
@fbengo
oops..sry my bad.
but as i said... straight from my head :)just adapt the starting method:
void someFunction() { QFile file(filePath); if (file.open(QFile::WriteOnly)) { QTextStream stream(&file); for (int r = 0; r < model->rowCount(); r++) this->printTree( 0, model->index(r,0), stream ); file.close(); } }