본문 바로가기
C_C++ 프로그래밍/QT

[QT] 메모장을 만들어보자 -2

by RoJae 2019. 6. 23.

      로재의 개발 일기      

메모장

이전에는 [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


관련글


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

반응형

댓글