ABOUT ME

Today
Yesterday
Total
  • 카테고리 없음 2020. 9. 22. 00:28

    이번 예제는 대화상자의 트리뷰에 아이콘과 체크상자를 추가하였으며 아이템(파일명) 선택시 체크상자가 체크되며 체크한 아이템만 압축이 풀리도록 코드를 구성하였다.사용법은 메인 트리뷰에서 zip 파일을 선택한 후 열기 아이콘을 클릭하면 트리뷰 대화상자가 뜨면서 트리뷰에 압축파일의 내용들이 표시된다. 압축을 풀고자하는 파일명만  체크하고 "압축풀기" 버튼을 누르면 선택한 폴더에 압축이 풀린다. 만드는 원리는 "Qt Tree View에서 선택한 zip 파일 내용(아카이브)를 대화상자의 List Widget에 불러오기" 예제에서  리스 위젯 대신에 트리뷰로 교체하였으며. 코드로 수정하였다. 대화상자에 "압축풀기" 버튼을 배치합니다.1. 대화상자의 클래스명을 "TreeViewDialog"로 정합니다.2. mainwindow.h 헤더 파일에 다소리 내용을 입력합니다.#include "QFileSystemModel"#include "qzipreader_p.h"#include "qzipwriter_p.h"#include "QDir"#include "QStandardItemModel"public:  QModelIndex index;  QString sDir, sFile, fileName, dirName;  float value;  // 콤보상자 아이템을 저장하기 위한 스트링리스트 변수 선언  QStringList comboBoxItem;  // 트리뷰 설정 함수 선언  void treeWiewSetup(QString str);  // 열기 아이콘 선택 함수 선언  void Tree_ZipOpen();  void on_treeView_clicked(const QModelIndex &index);  signals:    void SendText(QString ZipFile);private:       QFileSystemModel *dirModel, *fileModel;    QStandardItemModel *pModel; 3. mainwindow.cpp 소스파일에 다소리 내용을 입력합니다.MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent), ui(new Ui::MainWindow){   treeWiewSetup("d:/");}   // 트리뷰 설정 함수void MainWindow::treeWiewSetup(QString str){    // 파일시스템 모델의 폴더 객체 생성    dirModel = new QFileSystemModel(this);    // 파일시스템 모델의 파일 객체 생성    fileModel = new QFileSystemModel(this);       // 편집 금지 설정    dirModel->setReadOnly(false);    // 경로명 설정    dirModel->setRootPath(str);  fileModel->setRootPath(str);    // 트리뷰 헤더 정렬 설정    ui->treeView->header()->setStretchLastSection(true);    ui->treeView->header()->setSortIndicator(0, Qt::AscendingOrder);    ui->treeView->header()->setSortIndicatorShown(true);    // 트리뷰에 파일시스템 모델 설정    ui->treeView->setModel(dirModel);ui->treeView->setModel(fileModel);    // 모델 인덱스를 d 드라이버로 설정, // QDir::rootPath()    index = dirModel->index(str);index = fileModel->index(str);    ui->treeView->expand(index);    ui->treeView->scrollTo(index);    ui->treeView->setCurrentIndex(index);    ui->treeView->resizeColumnToContents(0);    ui->treeView->setColumnWidth(0, 250);    ui->treeView->setSortingEnabled(true);    // 아이템 편집 금지 설정    ui->treeView->setEditTriggers(QAbstractItemView::NoEditTriggers);    // 노드(아이템) 더블 클릭 허용 설정    ui->treeView->setExpandsOnDoubleClick(true);   }// 트리뷰 클릭 함수void MainWindow::on_treeView_clicked(const QModelIndex &index){       // 파일 시스템 모델에서 파일 정보가 폴더면    if(dirModel->fileInfo(index).isDir())    {        // 트리뷰에서 선택된 폴더명의 절대 경로를 sDir에 대입        sDir=dirModel->fileInfo(index).absoluteFilePath();        ui->statusBar->showMessage(sDir);           }    // 파일 시스템 모델에서 파일 정보가 파일이면    else if(fileModel->fileInfo(index).isFile())    {        sFile=fileModel->fileInfo(index).absoluteFilePath();        ui->statusBar->showMessage(sFile);             }}// 열기 아이콘 선택 함수void MainWindow::Tree_ZipOpen(){    if (!sFile.isEmpty())    {        QZipReader cZip(sFile);        foreach(QZipReader::FileInfo item, cZip.fileInfoList())        {               float value= qRound((float)(item.size)/1024);               qDebug() << item.filePath<<"("<exec();        cZip.close();    }}4. "treeViewdialog.h" 헤더 파일에 다소리 내용을 입력합니다.#include "QStandardItemModel"#include "QFileSystemModel"public:    bool isReject;    float value;    QString sDir, sFile, dirName;    QModelIndex index2;    QList tList;    // 트리뷰 컬럼헤더를 저장하는 스트링리스트 객체 선언    QStringList columnHeader;    // zip 파일의 아카이브명, 크기, 체크썹 값을 저장하는 스트링리스트 객체 선언    QStringList data, size, crc;    // 트리뷰 설정 함수 선언    void treeViewSetup(QString ZipFile);    // 선택된 아이템 만 압축을 풀어내는 함수 선언    void ExtractSelectedItems(QString ZipFile, QString folderName);public slots:    void reject();    // 메인 윈도우의 트리뷰에서 선택한 zip 파일을 수신하기 위한 함수 선언    QString RecvText(QString ZipFile)    {        treeViewSetup(ZipFile);        sFile=ZipFile;        return ZipFile;    }private slots:  // 압축풀기 버튼 위치에서 마우스 오른쪽 버튼 클릭시, "Go to slot->clicked()"를 선택하면 treeViewdialog.cpp 소스파일에 추가되는 함수    void on_extractButton_clicked();    // // 트리뷰 위치에서 마우스 오른쪽 버튼 클릭시, "Go to slot->clicked(QModelIndex)"를 선택하면 treeViewdialog.cpp 소스파일에 추가되는 함수    void on_treeView_clicked(const QModelIndex &index);   private:    // 그냥 아이템 모델 객체 변수 선언    QStandardItemModel *tModel;    // 그냥 아이템 객체 변수 선언    QStandardItem *parant, *child;    // 파일시스템모델 객체 변수 선언    QFileSystemModel *dirModel, *fileModel;    5. treeViewdialog.cpp 파이렝 다소리 내용을 입력합니다.#include "qzipwriter_p.h"#include "qzipreader_p.h"#include "mainwindow.h"#include "QDebug"#include "QMessageBox"#include "QFileDialog"TreeViewDialog::TreeViewDialog(QWidget *parent) :QDialog(parent), ui(new Ui::TreeViewDialog){    ui->setupUi(this);    isReject=false;}    // 트리뷰 설정 함수void TreeViewDialog::treeViewSetup(QString ZipFile){    // 트리뷰에 넣을 아이템 초기화    tModel=new QStandardItemModel(this);    parant=tModel->invisibleRootItem();    parant->setSelectable(false);    parant->setEditable(false);    QZipReader cZip(ZipFile); // ZipFile=sFile       // 트리뷰의 컬럼(열) 타이틀 설정(컬럼수:3개)    columnHeader<<"Name"<<"Size"<<"CRC32";    tModel->setHorizontalHeaderLabels(columnHeader);    ui->treeView->setRootIsDecorated(false);    ui->treeView->setSortingEnabled(true);    ui->treeView->resizeColumnToContents(0);    ui->treeView->setColumnWidth(0, 250);    // 아이템 편집 금지 설정    ui->treeView->setEditTriggers(QAbstractItemView::NoEditTriggers);    ui->treeView->setModel(tModel);    // 스트링리스트 변수인 data, size, crc에 각각 데이터를 저장하는 반복문    foreach(QZipReader::FileInfo item, cZip.fileInfoList())    {        value= qRound((float)(item.size)/1024);        qDebug() << item.filePath<<"("<setCheckable(true);        // parant 아이템의 행에 child 아이템 추가        parant->appendRow(child);    }    // zip 파일의 아카이브(파일명) 크기 수(열) 만큼 반복    for(int j=0; jsetData(tModel->index(j, 1), size.at(j));    // zip 파일의 아카이브(파일명) 체크썸 값 수(열) 만큼 반복    for(int k=0; ksetData(tModel->index(k, 2), crc.at(k));    qDebug()<<"Total Archive Number:"<treeView->currentIndex();    // 트리뷰에서 인덱스2로 모델 데이터를 datas에 대입,    QVariant datas = ui->treeView->model()->data(index2);    // datas를 문자열로 변환하여 str에 대입    QString str = datas.toString();    QFileInfo fo(str);    // 현재 선택된 행의 인덱스를 구해서 num에 대입    int num=index2.row();    // 리스트뷰의 행 수 만큼 반복    for(int i=0; irowCount();i++)    {        // i행 0열 아이템 모델을 구해서 currentIndex에 대입        auto currentIndex=tModel->index(i, 0);        // 리스뷰에서 현재 선택한 아이템이 파일 경로명과 같으면 if 문 실행        if(tModel->itemFromIndex(currentIndex)->data(Qt::DisplayRole) == str)        {            // num행, 0열의 child 아이템를 포함하는 parant 아이템을를 다시 child item에 대입            child = parant->child(num, 0);            qDebug()<<"Selected Index:"<checkState())            {                // 파일경로명에서 경로명을 제거한 파일명만 출력                qDebug()<<"Checked Data:"<setCheckState(Qt::Checked);            }            else            {                // child 아이템이 비체크 상태로 설정                child->setCheckState(Qt::Unchecked);                qDebug()<<"Unchecked";                // 체크 취소시, 리스트 배열에서 num 인덱스의 아이템 제거                tList.removeAt(num);            }        }    }}// "압축풀기" 버튼 클릭 함수void TreeViewDialog::on_extractButton_clicked(){    dirName = QFileDialog::getExistingDirectory(this, "Select Destination Folder", "/", QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);    if(!dirName.isEmpty())        ExtractSelectedItems(sFile, dirName);    for(int i=0; i

    >



    >



Designed by Tistory.