티스토리 뷰


[Qt] QString의 문자열 처리


  • 다음 환경을 사용하였습니다. 환경이 다를 경우, 일부 API가 동작하지 않을 수 있습니다.
    • [OS: Ubuntu 14.04.1 LTS]
    • [Qt Version: 5.4]

Qt에서는 문자열처리에 관련하여 다양한 API들을 제공하고 있다.

기본적으로 QString은 std::string 과 유사하다. 이 QString을 기본으로 하는 여러 API들이 있다. 레퍼런스를 이용하여 문자열간 복사가 일어나지 않게 하는 QStringRef 스트림처리 방식의 QTextStream 가 있다.


QString의 특징 중 하나는 유니코드 인코딩을 지원한다는 점이다. UTF-8과 UTF-16의 방식을 지정하여 사용 가능하다.

[QString 메뉴얼](http://doc.qt.io/qt-5/qstring.html

수 많은 QString의 API를 다 다룰 수는 없으니, 메뉴얼을 참고하기 바란다!

int형을 QString으로 변환하기

여기서는 문자열을 다루는 방법 중에 특히 '문자열을 만드는 방법'에 대해 다루고자 한다. 초보자가 다루기에는 당장의 int, double형 같은 변수를 QString에 담는 방법부터 문제가 될 수 있다.


이럴 때는 QString::number() 라는 함수가 존재한다.

예제코드

int math=100, kor=90, eng=80;
int res;
QString strTotal;

res = math + kor + eng;
strTotal = QString::number(res);

qDebug() << "strTotal: " << strTotal;        // strTotal: 270
  • 참조: qDebug()를 이용하기 위해서는, 헤더를 추가해 주어야 한다.

number 함수를 사용하는건 아주 간단한 편이다. 이 함수는 다양한 타입지정자로 오버로딩되어 있어서, double형, int형 전부 사용할 수 있다.

포맷지정자를 이용한 문자열 처리 방법

포맷지정자란, printf 함수를 사용하는 것처럼 사용하는 방법이다.


QString에서 포맷지정자를 이용하는 문자열 처리방법에는 QString::arg(), QString::sprintf(), QString::vsprintf() 따위가 있다.

sprintf / vsprintf

sprintf는 흔히 알려진 C라이브러리의 함수와 용도와 사용법이 비슷하다고 보면 된다. vsprintf도 C라이브러리의 동명 함수와 비슷하다. 다음은 함수의 원형이다.

QString& QString::sprintf(const char* cformat, ...);
QString& QString::vsprintf(const char* cformat, va_list ap);
  • 함수 설명: 인자로 받은 C Style의 포맷지정자를 포함한 문자열을 QString으로 반환하여 준다.
  • 파라미터:
    • cformat : 포맷지정자를 포함한 문자열
    • ... : 가변인자
    • va_list : 가변인수 리스트

vsprintf의 va_list에 대해서는 다음의 가변인자 다루는 방법을 참조하기 바란다.

예제코드

int math=100, kor=90, eng=80;
int res;
QString strTotal;

res = math + kor + eng;
strTotal.sprintf("strTotal: %d", res);

qDebug() << strTotal;        // strTotal: 270

Stream을 이용하는 방법

Qt공식 레퍼런스에서는 새로 작성하는 Qt코드(New Qt code)에서는 두 함수를 권장하지 않는다고 한다. 이는 다국어지원을 위한 이유도 있으며(Translation), UTF-8방식의 인코딩밖에 지원하지 못한다고 한다. Qt에서 제공하는 우회방법으로 스트림을 이용하는 방법을 제공하며, 예제코드는 다음과 같다.


예제코드

int math=100, kor=90, eng=80;
int res;
QString strTotal;

res = math + kor + eng;
QTextStream(&strTotal) << "strTotal: " << res;

qDebug() << strTotal;        // strTotal: 270

arg 함수를 이용하는 방법

포맷 지정자를 이용하는 마지막 방법은 QString::arg() 함수를 이용하는 방법이다. 아마도 이것이 Qt에서 가장 일반적인 방법일 것이다. 유니코드 인코딩도 완벽하게 지원하고, Qt Translation도 완벽하게 지원한다.


일단 arg의 아주 간단한 사용법을 예제코드로 알아보도록 하겠다.

예제코드

int math=100, kor=90, eng=80;
int res;
QString strTotal;

res = math + kor + eng;
strTotal = QString("strTotal: %1").arg(res);

qDebug() << strTotal;        // strTotal: 270

위와 처럼 %1, %2 같은 포맷을 사용한다. %99까지 사용가능하다고 한다. 여러 개의 포맷 지정자를 사용할 때 arg()함수를 계속 이어 붙이면 된다.


예제코드

int math=100, kor=90, eng=80;
int res;
QString strTotal;

res = math + kor + eng;
strTotal = QString("math: %1, kor: %2, eng: %3, total: %4")
                      .arg(math)
                      .arg(kor)
                      .arg(eng)
                      .arg(res);
qDebug() << strTotal;
// math: 100, kor:90, eng: 80, total: 270

만약, arg로 넘기는 타입 지정자에 매핑되는 각 변수가 QString 일 경우, 최대 9개까지 한번에 넘길 수 있다. (QString이 아닐 경우 하나씩밖에 넘길 수 없음)

ex) 위와 같은 코드를 QString타입으로 전달

strTotal = QString("math: %1, kor: %2, eng: %3, total: %4")
                      .arg(QString::number(math),
                              QString::number(kor),
                              QString::number(eng),
                              QString::number(res));

하.. 정말..

arg처럼 많은 오버로딩이 되어 있는 함수는 Qt에서도 흔치 않을 것이다. 하나하나 나열 하는것도 이렇게 힘들다.

QString QString::arg(int a, int fieldWidth=0, int base = 10, QChar fillChar = QLatin1Char(' ')) const;
QString QString::arg(uint a, int fieldWidth=0, int base = 10, QChar fillChar = QLatin1Char(' ')) const;
QString QString::arg(long a, int fieldWidth=0, int base = 10, QChar fillChar = QLatin1Char(' ')) const;
QString QString::arg(ulong a, int fieldWidth=0, int base = 10, QChar fillChar = QLatin1Char(' ')) const;
QString QString::arg(qlonglong a, int fieldWidth=0, int base = 10, QChar fillChar = QLatin1Char(' ')) const;
QString QString::arg(qulonglong a, int fieldWidth=0, int base = 10, QChar fillChar = QLatin1Char(' ')) const;
QString QString::arg(short a, int fieldWidth=0, int base = 10, QChar fillChar = QLatin1Char(' ')) const;
QString QString::arg(ushort a, int fieldWidth=0, int base = 10, QChar fillChar = QLatin1Char(' ')) const;
  • 함수 설명: 정수형을 argument로 전달하는 방법이다. 정수형 말고는 전부 기본 매개변수를 가지고 있으므로, 첫 번째 파라미터 하나만을 넘겨주어도 된다.
  • 파라미터:
    • a: arg로 넘겨진 파라미터
    • fieldWidth: 표시될 길이. C Style로 따지면 %5d의 5와 같은 의미이다. a로 넘겨지는 파라미터의 크기보다 길면 우측정렬로 표시된다.
    • base: 첫 번째 파라미터가 정수형이므로, 진수 표시 형식을 의미한다. 10진수가 기본형이다.
    • fillChar: fieldWidth의 길이가 a보다 길이보다 길면, 그 여백을 채우는 문자열이다. C Style로 %05d 의 '0' 같은 의미이다. 물론 fillChar를 0으로 설정했을때의 의미이다.

물론 double형도 가능하다.

QString QString::arg(double a, int fieldWidth=0, char format='g', int precision=-1, QChar fillChar = QLatin1Char(' ')) const;
  • 함수 설명: 실수형을 argument로 전달하는 방법이다.
  • 파라미터:

    • a: arg로 넘겨진 파라미터
    • filedWidth: 표시될 길이
    • format: 포맷지정자를 사용한다. 다음의 포맷을 사용할 수 있다. (C Style의 포맷 지정자와 의미가 같다.)
    포맷 의미
    e 과학적 표기법 (소문자 e로 표기)
    E 과학적 표기법 (대문자 E로 표기)
    f 소수점 표기
    g e와 f중 짧은 것을 선택
    G E와 f중 짧은 것을 선택

    * 참조: 과학적 표기법이란, 아주 큰 수나 아주 작은 수를 나타낼 때 주로 사용되는 E 지수 표기법을 의미

    • precision: 표시할 소수점의 자리수
    • fillChar: filedWidth와 a의 길이차에 생기는 패딩을 채우는 값
QString QString::arg(QChar a, int fieldWidth=0, QChar fillChar = QLatin1Char(' ')) const;
QString QString::arg(char a, int fieldWidth=0, QChar fillChar = QLatin1Char(' ')) const;
QString QString::arg(QChar a, int fieldWidth=0, QChar fillChar = QLatin1Char(' ')) const;
QString QString::arg(QString &a, int fieldWidth=0, QChar fillChar = QLatin1Char(' ')) const;
QString QString::arg(QString &a1, QString &a2) const;
QString QString::arg(QString &a1, QString &a2, QString &a3) const;
....
QString QString::arg(QString &a1, QString &a2, QString &a3,  QString &a4, QString &a5, QString &a6,
                         QString &a7, QString &a8, QString &a9,) const;

그 외 소개 하지 않은 나머지 오버로딩된 함수들이다. char나, QString을 담는 역할을 한다.

참고


  • 다음 환경을 사용하였습니다. 환경이 다를 경우, 일부 API가 동작하지 않을 수 있습니다.
    • [OS: Ubuntu 14.04.1 LTS]
    • [Qt Version: 5.4]


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/10   »
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
글 보관함