2016-01-25 38 views
0

我需要将我的QTreeView(QSortFilterProxyModel和QStandardItemModel)的当前视图保存为.csv文件。不幸的是,我不知道从哪里开始...如何在Qt中将treeview保存为.csv文件?

我想我应该使用QSortFilterProxyModel,因为我需要保存当前的视图,但我不知道...任何想法?有没有办法了解一行是父母吗?

TreeView所hierarchial,有5列:

enter image description here

。CSV输出我需要:

"(0028,2110)",LossyImageCo,CS,2,00 
"(00028,3000)",ModalityLUTse,SQ,, 
,"(0028,3002)",LUTDesciptoi,US,6,4096\0\12 
etc... 

到目前为止我的代码:

for (int i = 0; i < proxyModel->rowCount(); i++) 
    { 
     for (int j = 0; j < proxyModel->columnCount(); j++) 
     { 
      QModelIndex index = proxyModel->index(i, j); 
      qDebug() << "Data: " << proxyModel->data(index).toString(); 
      // How do I know when to start a child row? 
     } 
    } 

更新1:

我已经创建了所有父行的文件。我如何获得子行?

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

输出:

(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 
+0

你如何填充树视图,即你从哪里获取这些数据?你在使用模型吗? – ramtheconqueror

+0

是的,我使用QSortFilterProxyModel和QStandardItemModel,但我需要当前视图(过滤后),所以我不知道我是否可以使用它们... – Engo

+0

@ramtheconqueror你可以看看我的更新吗? – Engo

回答

1

要遍历QTreeWidget子项使用QTreeWidget :: topLevelItem()来访问顶层的项目,然后用递归:: QTreeWidgetItem孩子()遍历下级儿童和他们的孩子。

你自己在加载这个dicom文件吗?您还可以查看gdcmdump的源代码。修改该代码以输出csv而不是其标准输出。这将是直截了当的。

+0

我没有使用QTreeWidget。是的,我自己加载这个文件,但我需要存储当前的视图,而不是一个完整的文件。这就是我使用QSortFilterProxyModel的原因 – Engo

+0

你不能只在视图中的第一个项目上调用topLevelItem,然后递归到视图中的最后一个项目? –

+0

您能否提供一些示例(伪)代码?这并不完全清楚.. – Engo