ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [QT] 메모장을 만들어보자 -2
    C_C++ 프로그래밍/QT 2019. 6. 23. 23:14

          로재의 개발 일기      

    메모장

    이전에는 [QT] 메모장을 만들어보자 -1 에서 UI를 작성하였습니다.

    이제 본격적으로 약간의 설명을 덧 붙인 뒤에 코드를 첨부하겠습니다.



      QString..?

    1
    2
    3
    4
    5
    6
    QString i;           // current file's number
    QString total;       // number of files to process
    QString fileName;    // current file's name
     
    QString status = QString("Processing file %1 of %2: %3")
                    .arg(i).arg(total).arg(fileName);
    cs

    QString은 QT에서 제공하는 String 라이브러리이며, QString의 인자는 99개까지 가능합니다.

    즉, 위의 코드에서 보다시피 %1 %2 %3가 존재하는데 이는 뒤에 나오는 .arg()를 통해서 정의를 하여

    QString 함수를 통해서 status에 문자열이 문자열이 생성이 가능합니다.


      QFileDialog..?

    1
    2
    3
    4
    5
    dir = QFileDialog::getExistingDirectory();
    dir.setFilter(QDir::Files | QDir::NoSymLinks);
     
    ui->listDir->clear();
    list = dir.entryInfoList();
    cs

    QFileDialog dir을 통해서 현재 파일의 위치를 받아오며

    setFilter를 통해서 예외 파일들을 제외한 파일들의 목록을

    list로 받아옵니다.



      QFileInfo

    1
    2
    3
    4
    5
    6
    7
    list = dir.entryInfoList();
     
    // loop for file print
    for(int i = 0; i < list.size(); ++i){
        QFileInfo fileInfo = list.at(i);
        ui -> listDir ->addItem(QString("%1").arg(fileInfo.fileName()));
    }
    cs

    list에 필터를 통한 파일들의 목록이 들어가게 됩니다. (QFileInfoList list)

    이 list에 있는 파일 목록들을 QFileInfo fileInfo에 하나씩 넣어주고

    이것을 ui에 하나 씩 추가해줍니다.



      QFile.open

    1
    2
    3
    4
    5
    6
    7
    8
    // get filename to absolute path
    filename = QString("%1").arg(list.at(ui->listDir->currentIndex().row()).absoluteFilePath());
    QFile file(filename);
    file.open(QIODevice::ReadOnly);
     
    // textFile clear and print file list
    ui->textFile->clear();
    ui->textFile->append(file.readAll());
    cs

    filename에 사용자가 지정한 파일을 QString 형식으로 받아옵니다.

    받아온 파일의 절대 위치를 QFile의 file에 넣어주고

    읽기 전용으로 열고 이 파일의 내용을 textFile (오른쪽 파일 수정 및 작성 textEdit)에 전체를 붙여줍니다.



      Qfile.write

    1
    2
    3
    4
    5
    QByteArray bytearray = ui->textFile->toPlainText().toUtf8().left(ui->textFile->toPlainText().length());
     
    file.open(QIODevice::WriteOnly);
    file.write(bytearray);
    file.close();
    cs

    QByteArray는 QT에서 제공하는 배열로 메모리 효율이 char *보다 뛰어납니다.

    이 배열에 우리가 작성한 textFile 내용을 UTF8 형식으로 인코딩을 시킨 이후

    위에서 열은 file에 write 합니다.



      코드 첨부

    우선 변수를 사용하기 위해서 헤더 파일에 다음과 같은 코드를 추가합니다.
    1
    2
    QDir dir;
    QFileInfoList list;
    cs


    이후 위에서 설명한 내용을 토대로 아래의 소스코드를
    MainWindow.cpp에 작성하면서 이해를 해봅시다.

    (혹시 이해가 어렵다면 아래의 references를 참고하면 좋을 것 같습니다)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    void MainWindow::on_pushButton_exit_clicked()
    {
        // close window
        this ->close();
    }
     
    void MainWindow::on_pushButton_select_clicked()
    {
        // show exisiting directory
        dir = QFileDialog::getExistingDirectory();
        dir.setFilter(QDir::Files | QDir::NoSymLinks);
     
        ui->listDir->clear();
        list = dir.entryInfoList();
     
        // loop for file print
        for(int i = 0; i < list.size(); ++i){
            QFileInfo fileInfo = list.at(i);
            ui -> listDir ->addItem(QString("%1").arg(fileInfo.fileName()));
        }
    }
     
    void MainWindow::on_pushButton_open_clicked()
    {
        QString path, filename;
     
        // get filename to absolute path
        filename = QString("%1").arg(list.at(ui->listDir->currentIndex().row()).absoluteFilePath());
        QFile file(filename);
        file.open(QIODevice::ReadOnly);
     
        // textFile clear and print file list
        ui->textFile->clear();
        ui->textFile->append(file.readAll());
        file.close();
     
        QMessageBox msgbox;
        msgbox.setText("File Opened");
        msgbox.exec();
    }
     
    void MainWindow::on_pushButton_save_clicked()
    {
        QString path, filename;
     
        // get filename to absolute path
        filename = QString("%1").arg(list.at(ui->listDir->currentIndex().row()).absoluteFilePath());
     
        // add .text
        QFile file(filename + ".text");
     
        // Insert into the array after encoding.
        QByteArray bytearray = ui->textFile->toPlainText().toUtf8().left(ui->textFile->toPlainText().length());
     
        file.open(QIODevice::WriteOnly);
        file.write(bytearray);
        file.close();
     
        QMessageBox msgbox;
        msgbox.setText("File Saved");
        msgbox.exec();
    }
     
    cs


    관련글


    ※ 본 글은 개인 포트폴리오 혹은 공부용으로 사용하기 때문에, 무단 복사 유포는 금지하지만, 개인 공부 용도로는 얼마든지 사용하셔도 좋습니다

    반응형
Designed by Tistory.