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 이건칠
,

TableWidgetCV.zip


CustomTableWidget 클래스 생성

void CustomTableWidget::keyPressEvent(QKeyEvent *event)
{
     QModelIndexList selectedModel=selectedIndexes(); //cell selected
     qSort(selectedModel.begin(),selectedModel.end()); //ASC sort
     if(event->matches(QKeySequence::Delete)) //del key
     {
          foreach (QModelIndex index, selectedModel)
          {
               QTableWidgetItem *delItem=item(index.row(),index.column());
               if(delItem!=NULL)
               {
                    item(index.row(),index.column())->setText("");
               }
          }
     }
     if(event->matches(QKeySequence::Copy)) //ctrl + c
     {
           if(selectedModel.isEmpty())
           {
                return;
           }
           copyIndexList=selectedModel;
     }
     if(event->matches(QKeySequence::Paste)) //ctrl + v
     {
         if(!copyIndexList.isEmpty())
         {
              if(selectedModel.isEmpty())
              {
                   return;
              }
              int startRow=selectedModel.first().row();
              int startColumn=selectedModel.first().column();
              int copyListFirstRow=copyIndexList.first().row();
              int copyListFirstColumn=copyIndexList.first().column();

              foreach (QModelIndex index, copyIndexList)
              {
                   if(copyListFirstRow!=index.row())
                   {
                         startRow+=index.row()-copyListFirstRow;
                         copyListFirstRow=index.row();
                   }


                  if(copyListFirstColumn!=index.column())
                  {
                        startColumn+=index.column()-copyListFirstColumn;
                        copyListFirstColumn=index.column();
                  }
                  setItem(startRow,startColumn,new QTableWidgetItem(item(index.row(),index.col                   umn())->text()));
            }
        }
    }
}



Posted by 이건칠
,

tar 파일 첨부

tar 명령어 참조
http://sun2ne.tistory.com/74

예시
1) tar.exe -cvf 123.zip 123/AttachedFiles

폴더도 같이 압축이 된것을 볼 수 있다.

2)tar.exe -cvf 123.zip -C 123/AttachedFiles .

폴더 없이 압축된것을 볼 수 있다.



QProcess::execute(QString("tar.exe -cvf 파일이름.zip -C 압축할폴더 .));

설명
1) tar.exe의 경로가 다르다면 tar.exe 앞에 경로를 붙여준다.
2) -cvf는 명령어 이다. 기본적으로 압축시에 거의 이 형식으로 쓴다.
3) 파일이름.zip를 다른경로에 저장시키려면 파일이름.zip앞에 경로를 붙인다.
4) -C 와 . 의 경우 위의 두그림과 같이 폴더를 같이 압축할건지, 폴더 없어 파일만 압축할 건지를
정하는 명령어이다.

tar압축 시 절대 경로 관련 참조 
https://kldp.org/node/140877


Posted by 이건칠
,

QFile file("파일이름");
if(!file.exists()) //파일이 없으면
{
     return;
}
if(file.open(QFile::ReadOnly))
{
     //MD5이외 다른 해쉬값 변경해도된다.
     QCryptographicHash cryptohash(QCryptographicHash::Md5); 
     if(cryptohash.addData(&file))
     {
          qDebug()<<cryptohash.result().toHex();
     }
}
file.close();


Posted by 이건칠
,

TopLevel에 추가
QTreeWidgetItem *item=new QTreeWidgetItem();
item->setFlags(child->flags()|Qt::ItemIsUserCheckable); child->setCheckState(i,Qt::Unchecked);
item->setTextAlignment(i,Qt::AlignCenter);
ui->treeWidget->addTopLevelItem(item);

Child에 추가
QTreeWidgetItem *item = ui->treeWidget->topLevelItem(0);
QTreeWidgetItem* child = new QTreeWidgetItem();
child->setFlags(child->flags()|Qt::ItemIsUserCheckable);
child->setCheckState(0,Qt::Unchecked);
child->setTextAlignment(i,Qt::AlignCenter);

item->addChild(child);
ui->treeWidget->addTopLevelItem(item);

Posted by 이건칠
,

추가
QTreeWidgetItem* item= new QTreeWidgetItem(ui->treeWidget); 
QComboBox *Combobox=new QComboBox();
//setItemWidget 인자설명
//1.TreewidgetItem,2.추가할 컬럼, 3.추가할위젯

ui->treeWidget->setItemWidget(item,0,Combobox);

삭제
//Toplevel에서의 삭제 = 0은 Toplevel의 맨처음 아이템
//Child를 삭제하려면, topLevelItem(0)->child(0)을 추가하면된다.
QTreeWidgetItem* item= ui->treeWidget->topLevelItem(0) ;
//1.TreewidgetItem, 2. 삭제할 컬럼
ui->treeWidget->removeItemWidget(item,0);

Combobox 데이터 추가
for(int i=0; i<ui->treeWidget->topLevelItemCount(); i++)

{
     for(int j=0; j<ui->treeWidget->topLevelItem(i)->childCount(); j++)
     {
          QTreeWidgetItem *testItem=ui->treeWidget->topLevelItem(i)->child                                                     (j);
          auto Combobox=(QComboBox*)ui->treeWidget->itemWidget                                               (testItem,0);
               for(int k=0; k<ui->treeWidget->topLevelItem(i)->childCount(); k++)
               {                  
                    Combobox->addItem(ui->treeWidget->topLevelItem(i)->child                     (k)->text(1));
               }
       }
}


Posted by 이건칠
,

QTableWidget에 QCheckBox를 추가시 아래 그림과 같이 기본적으로 추가된다.

CheckBox를 아래 그림과 같이 중앙에 정렬되기 위해선 

다음과 같이 2가지 방법이 있다.

1번 방법
위젯의 레이아웃을 이용하여 가운데 정렬하는 방법
QWidget *pWidget = new QWidget();
QCheckBox *pCheckBox = new QCheckBox();
QHBoxLayout *pLayout = new QHBoxLayout(pWidget);
pLayout->addWidget(pCheckBox);
pLayout->setAlignment(Qt::AlignCenter);
pLayout->setContentsMargins(0,0,0,0);
pWidget->setLayout(pLayout);
ui->tableWidget_Main->setCellWidget(0,0,pWidget);


2번방법
setStylesheey 함수를 이용하는 방법
QCheckBox *Checkbox=new QCheckBox();
Checkbox->setStyleSheet("margin-left:50%; margin-right:50%;");
ui->tableWidget_Main->setCellWidget(0,0,Checkbox);


Posted by 이건칠
,

QCPItemText *item=new QCPItemText(ui->widget_RealTimeGraph); 
item->setPositionAlignment(Qt::AlignVCenter|Qt::AlignHCenter);
item->position->setCoords(key,value+10);
item->setColor(ui->widget_RealTimeGraph->graph(0)->pen().color());
item->setText(QString::number(value));



RealTimeGraph.zip



http://www.qcustomplot.com/

Posted by 이건칠
,

간혹 fopen 함수를 사용하여, 파일을 읽어 올 경우, 파일이름이 한글인 경우, 파일을 불러올 수 없는 경우를 볼 수 있다. 이 경우 아래의 코드로 사용하면, 한글로 입력된 이름을 읽어 올 수있다.

QString FileName="한글이름";
FILE *local;
local=fopen(FileName.toLocal8Bit().data(),"rb");


Posted by 이건칠
,

QString Test="Test";
const char *str=Test.toUtf8().constData();

위의 코드로도 QString->Char를 변환할 수 있지만, const char에는 간혹 이상한 값이 들어갈 수 있기에 아래의 코드로 진행한다.

QString Test="Test";
char str[1024]={0,};

qsnprintf(str,sizeof(str),"%s",Test.toUtf8().constData());


Posted by 이건칠
,