TableWidgetExternCV.zip



QTableWidget에서 Excel의 값을 copy & paste 하려면, 아래의 코드를 이용하여, 값을 가져올 수 있다.
QClipboard *clipboard=QApplication::clipboard();
clipboard->text(); //클립보드에 저장된 Excel 의 값 가져오기
clipboard->setText(); //클립보드에 값을 복사한 후, Excel에 값 붙여 넣기

엑셀로 값을 내보내거나 가져올 때 값은  1\t2\t3\n4\t5\t6\n7\t8\t9\n
와 같이 정의 된다.
\t는 Column을 의미하며, \n은 Row를 의미한다.
위의 예시는
1 2 3
4 5 6
7 8 9
를 의미한다.



이 규칙만 잘 알면, copy & paste를 쉽게 할 수 있다.

CustomTableWidget 클래스 생성

void CustomTableWidget::keyPressEvent(QKeyEvent *event)

{
     QModelIndexList selectedIndexList=selectedIndexes();
     int startRow=selectedIndexList.first().row();
     int startColumn=selectedIndexList.first().column();
     if(event->matches(QKeySequence::Copy))
     {
          qSort(selectedIndexList.begin(),selectedIndexList.end());
          QClipboard *clipboard=QApplication::clipboard();
          QString Text;
          foreach (QModelIndex index, selectedIndexList)
          {
               if(index.row()!=startRow)
               {
                    Text.append("\n");
                    startRow=index.row();
                    startColumn=selectedIndexList.first().column();
               }
               if(index.column()!=startColumn)
               {
                     for(int i=0; i<index.column()-startColumn; i++)
                     {
                          Text.append("\t");
                     }
                     startColumn=index.column();
               }
              Text.append(index.data().toString());
           }
           clipboard->setText(Text);
       } 
      if(event->matches(QKeySequence::Paste))
      {
          QClipboard *clipboard=QApplication::clipboard();
          QStringList rowList=clipboard->text().split("\n");
          QStringList columnList;
          int number=0;

          foreach (QString row, rowList)
          {
               if(number++<rowList.count()-1)
               {
                     if(row.contains("\t"))
                     {
                          columnList=row.split("\t");
                          foreach (QString column, columnList)
                          {
                                if(startColumn>=columnCount())
                                {
                                      break;
                                }
                               else
                               {
                                     QTableWidgetItem *copyItem=item(startRow,startColumn);
                                     if(copyItem!=NULL)
                                     {
                                           copyItem->setText(column);
                                     }
                                     else
                                     {
                                           setItem(startRow,startColumn,new QTableWidgetItem(column));
                                     }
                               }
                               startColumn++;
                          }
                   }
                  else
                  {
                       QTableWidgetItem *copyItem=item(startRow,startColumn);
                       if(copyItem!=NULL)
                       {
                              copyItem->setText(row);
                       }
                       else
                       {
                              setItem(startRow,startColumn,new QTableWidgetItem(row));
                        }
                   }
                   startColumn=selectedIndexList.first().column();
                   startRow++;
               }
          }
      }
}


Posted by 이건칠
,