스터디/QT 스터디

QT 스터디 챕터 7~8

DDD Developer 2024. 10. 8. 09:55
728x90
반응형

 

7. Qt 에서 제공하는 데이터 타입과 클래스

 

Qt는 개발자의 편의성을 위해 다양한 데이터타입을 제공한다.

예를 들어 QString 과 같 은 문자열 내에 특정 패턴을 찾아내기 위해 정규식 표현을 지원하거나 문자열에 특정 문자를 추가하거나 삭제 등 다양한 기능을 제공한다.

Qt에서는 이기 종간의 데이터 교환 시 데이터 타입의 변화로 생기는 문제를 해결하기 위한 데이터 타입도 지원한다.

예를 들어 우분투 리눅스 운영체제상에서 Qt로 개발한 어플리케이션 내에 “Hello World” 라는 문자열을 Qt 에서 제공하는 QString 이라는 문자열을 전송한다.

그리고 이 문자열을 수신 받는 측에서는 MS윈도우 운영체제상에서 Visual C++로 개발 하여 “Hello World” 문자열을 CString 문자열을 저장한다면 두 개의 데이터가 다른 데이터가 저장된다.

 

위의 그림에서 보는 것과 같이 이 기종 간의 문제를 해결하기 위해서 QString을 QByteArray 로 변환해 전송하면 수신 받는 측에서 Char 형으로 사용할 수 있기 때문에 이기종 간의 데이터 문제를 해결할 수 있다. 또한 Qt는 QVariant 데이터 타입과 같이 void 형 데이터 타입도 지원한다. 다음 표는 Qt에서 주로 사용되는 데이터 타입이다.

 

Qt는 데이터 타입의 값을 판단/비교하기 위한 일반 함수와 템플릿 함수를 제공한다.

예 를 들어 절대값을 구하기 위해 qAbs( ) 함수를 제공하며 최대/최소 사이의 값을 구하기 위해 qBound( ) 함수를 제공한다.

최소값을 구하기 위한 qMin( )을 제공하며 최대 값을 구하기 위한 qMax( ) 함수를 제공한다.

 

 

 

 절대값 구하기

int absoluteValue;
int myValue = -4;
absoluteValue = qAbs(myValue); // absoluteValue == 4
 

 

 최소값과 최대값 사이의 값 구하기

int myValue = 10;
int minValue = 2;
int maxValue = 6;
int boundedValue = qBound(minValue, myValue, maxValue);
// boundedValue == 6
 

 

 소수점을 비교하기 위한 함수

// 0.0과 비교
qFuzzyCompare(0.0,1.0e-200); // return false
qFuzzyCompare(1 + 0.0, 1 + 1.0e-200); // return true
 

 

 최대값 구하기

int myValue = 6;
int yourValue = 4;
int maxValue = qMax(myValue, yourValue);
int minValue = qMin(myValue, yourValue);
 

 

 int형 반올림

qreal valueA = 2.3;
qreal valueB = 2.7;
int roundedValueA = qRound(valueA); // roundedValueA = 2
int roundedValueB = qRound(valueB); // roundedValueB = 3
 

 

 64bit int형 반올림

qreal valueA = 42949672960.3;
qreal valueB = 42949672960.7;
int roundedA = qRound(valueA); // roundedA = 42949672960
int roundedB = qRound(valueB); // roundedB = 42949672961
 

 문자열 데이터 타입 클래스

 

Qt는 단순한 문자열을 다루는 클래스 이외에도 데이터 스트림, 멀티 바이트 캐릭터 형 태의 유니코드 4.0(Unicode Standard Version) 캐릭터를 지원하는 다양한 클래스를 제공 한다.

 

 

 QByteArray

 

QByteArray 클래스는 바이트(8-bit) 단위의 배열을 제공한다.

QByteArray 클래스는 배열 을 핸들링 하기 위해 append( ), prepend( ), insert( ), replace( ) 그리고 remove( ) 멤버 함수를 제공한다.

QByteArray x("Q");
x.prepend("I love"); // x == I love Q
x.append("t -^^*"); // x == I love Qt -^^*
x.replace(13, 1, "*"); // x == I love Qt *^^*
QByteArray x("I love Qt -^^*");
x.remove(13, 4); // x == I love Qt
 

 

 QByteArrayMatcher

 

바이트 배열에서 매칭되는 바이트 배열 패턴을 찾기 위해 제공되는 클래스이다.

// 전체 QByteArray
QByteArray x(" hello Qt, nice to meet you.");
QByteArray y("Qt"); // x에서 찾고자 하는 문자열
QByteArrayMatcher matcher(y);

//문자열이 시작되는 위치 index 변수에 저장
int index = matcher.indexIn(x, 0);
qDebug( "index : %d", index);
qDebug( "QByte : %c%c", x.at(index), x.at(index+1));
 

 

 QChar

 

16 Bit 유니코드를 지원하기 위한 Character 클래스 이다

QLabel *lbl = new QLabel("", this);
QString str = "Hello Qt";
QChar *data = str.data();
QString str_display;
while(!data->isNull())
{
str_display.append(data->unicode());
++data;
}
lbl->setText(str_display); // Hello Qt
 

 

 QLatin1String

 

US-ASCII/Latin-1 인코딩 문자열을 지원하기 위해 제공되는 클래스 이다.

QLatin1String latin("Qt");
QString str = QString("Qt");
if (str == latin)
    qDebug("Equal.");
else
    qDebug("Not equal.");
bool is_equal = latin.operator==(str);
if (is_equal)
    qDebug("Equal.");
else
    qDebug("Not equal.");
 

 

 QLocale

 

이 클래스는 다양한 언어 Character set으로 변환하기 위해 사용한다.

QLocale egyptian(QLocale::Arabic, QLocale::Egypt);
QString s1 = egyptian.toString(1.571429E+07, 'e');
QString s2 = egyptian.toString(10);
double d = egyptian.toDouble(s1);
int i = egyptian.toInt(s2);
 

 

 QString

 

QString 클래스는 유니코드 문자열을 지원하며 16bit QChar를 저장할 수 있는 기능 제공한다.

QString str = "Hello";
 

QString 은 const char * 와 같은 문자열 상수를 fromUtf8() 함수를 사용해 대체할 수 있는 기능을 제공한다.

static const QChar data[4] = {0x0055, 0x006e, 0x10e3, 0x03a3 };
QString str(data, 4);
 

저장된 문자열의 특정 위치에 QChar 을 저장할 수 있는 기능 제공한다.

QString str;
str.resize(4);
str[0] = QChar('U');
str[1] = QChar('n');
str[2] = QChar(0x10e3);
str[3] = QChar(0x03a3);
 

문자열을 비교하기 위해 QString 은 if 문을 이용해 다음과 같은 비교가 가능하다

QString str;
if (str == "auto" || str == "extern" || str == "static" || str == "register")
{
    // ...
}
 

찾고자 하는 특정 문자열의 위치를 알고 싶다면 indexOf() 함수를 사용해 찾고자 하는 문자열의 위치를 찾을 수 있다.

QString str = "We must be <b>bold</b>, very <b>bold</b>";
int j = 0;
while ((j = str.indexOf("<b>", j)) != -1)
{
    qDebug() << "Found <b> tag at index position" << j;
    ++j;
}
 

 

 QStringList

QStringList strList;
strList << "Monday" << "Tuesday" << "Wednesday";
QString str;
str = strList.join(",");
// str == " Monday, Tuesday, Wednesday"
 

 

 QTextStream

 

QTextStream 클래스는 대량의 텍스트 데이터를 다루기 위해 *STREAM 처리 방식을 제공한다.

STREAM 방식을 이용하면 대량의 데이터를 효율적으로 빠르게 접근해 데이터 를 READ하거나 WRITE 할 수 있다.

다음 예제는 QFile 클래스를 이용해 파일로부터 READ 한 데이터를 QTextStream 을 사용한 예제이다.

QFile file("in.txt");
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
    return;
QTextStream in(&file);
while (!in.atEnd())
{
    QString line = in.readLine();
    ...
}
 

<모르는 용어 정리>

 

STREAM 처리 방식은 데이터를 순차적으로 처리하는 방법입니다.

이 방식은 데이터를 한 번에 모두 처리하는 것이 아니라,

**연속적인 흐름(Stream)**으로 데이터를 읽거나 쓰는 과정을 의미합니다.

이 처리 방식은 특히 대량의 데이터를 다룰 때 유용합니다.

 

주요 특징:

 

순차적 처리: 데이터를 한 번에 모두 메모리에 로드하지 않고, 작은 단위로 읽거나 씀으로써 메모리 사용을 줄입니다.

메모리 효율성: 한꺼번에 많은 데이터를 처리할 때 메모리가 부족한 상황을 피할 수 있습니다. 데이터를 필요할 때마다 조금씩 처리하기 때문에 대량의 데이터를 효율적으로 다룰 수 있습니다.

지연 처리(Lazy Processing): 전체 데이터를 다 불러오지 않고, 필요할 때만 읽고 처리하는 방식입니다. 이를 통해 대기 시간이나 메모리 부담을 줄일 수 있습니다.

 

STREAM 처리 방식의 예:

 

파일 입출력: 데이터를 파일에서 읽거나 파일로 쓸 때, 보통 한 번에 파일 전체를 다루는 것이 아니라 스트림을 사용해 순차적으로 처리합니다.

네트워크 통신: 네트워크를 통해 데이터를 주고받을 때도 데이터를 순차적으로 전송하고 받는 스트림 방식을 사용합니다.

 

QTextStream 클래스와 STREAM 처리:

 

QTextStream은 Qt에서 텍스트 데이터를 스트림 방식으로 처리하기 위한 클래스입니다. 이를 사용하면 파일이나 문자열 등에서 텍스트 데이터를 순차적으로 읽고 쓰는 작업을 간편하게 처리할 수 있습니다.

 

예시:

QFile file("example.txt");
if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
    QTextStream in(&file);
    while (!in.atEnd()) {
        QString line = in.readLine();  // 파일에서 한 줄씩 읽음
        qDebug() << line;
    }
    file.close();
}
 

위 코드에서 QTextStream은 파일로부터 한 줄씩 데이터를 읽어오는 스트림 방식으로 처리합니다. 파일 전체를 한 번에 다루지 않고, 필요한 만큼만 순차적으로 처리하는 것입니다.

 

STREAM 처리 방식의 장점:

 

대량 데이터 처리: 한 번에 메모리로 불러오지 않기 때문에 대용량 데이터를 다룰 때도 메모리 효율적입니다.

지연된 데이터 처리: 데이터를 다 처리할 때까지 기다릴 필요 없이, 읽거나 쓰는 작업을 동시에 진행할 수 있습니다.

파일 및 네트워크 입출력에 유용: 파일이나 네트워크에서 데이터를 주고받는 환경에서 자주 사용됩니다.

 

이처럼 STREAM 처리 방식은 대량의 데이터를 다루면서 메모리 효율성을 높이고, 순차적으로 데이터를 처리할 수 있게 해주는 유용한 방법입니다. QTextStream은 이 방식을 사용하여 파일 입출력과 같은 작업을 효과적으로 수행할 수 있도록 돕습니다.


- 데이터 클래스

 

Qt에서 제공하는 기본 데이터 타입과 더불어 유연한 데이터 조작을 위해 다양한 클래스를 제공한다.

예를 들어 Bit 단위의 데이터를 다루기 위한 QBitArray, Byte 단위의 데 이터를 배열 형태로 다루기 위해 QByteArray 등과 같이 데이터 조작에 편리한 클래스를 제공한다.

여기서는 데이터를 다루는데 유용한 클래스에 대해 알아보도록 하자.

 

- QBitArray

 

QBitArray 클래스는 Bit 단위를 데이터로 관리할 수 있는 기능을 제공한다. AND, OR, XOR 그리고 NOT 연산을 통해 Bit 연산 기능을 제공한다.

QBitArray ba(200);
QBitArray ba;
ba.resize(3);
ba[0] = true;
ba[1] = false;
ba[2] = true;

QBitArray x(5);
x.setBit(3, true); // x: [ 0, 0, 0, 1, 0 ]
QBitArray y(5);
y.setBit(4, true); // y: [ 0, 0, 0, 0, 1 ]
x |= y;            // x: [ 0, 0, 0, 1, 1 ]
 

- QMargins

 

QMargins 클래스는 Left, Top, Right, Bottom을 저장할 수 있으며 setLeft( ), setRight( ), setTop( ) 그리고 setBottom( ) 멤버 함수를 이용해 값을 저장 또는 수정할 수 있다.

QMargins margin;
margin.setLeft(10);
margin.setTop(12);
margin.setRight(14);
margin.setBottom(16);
qDebug() << "QMargins Value : " << margin;
// QMargins Value : QMargins(10, 12, 14, 16)
 

- QPoint

 

QPoint 클래스는 좌표 지점을 표시하기 위해 사용되는 기능을 제공한다.

QPoint p;
p.setX(p.x() + 1);
p += QPoint(1, 0);
p.rx()++;
 

QPoint 는 operator를 통해 아래과 같이 사용할 수 있다.

QPoint p( 3, 7);
QPoint q(-1, 4);
p += q; // p becomes (2, 11)
 

- QQuaternion

 

QQuaternion는 벡터 및 스칼라로 구성된 Quaternion을 사용할 수 있다. Quaternion은 3D 공간에서 SCALAR, X, Y 그리고 Z 좌표와 회전과 같은 각도를 3D에 사용되는 데이 터를 관리하는 기능을 제공한다.

QQuaternion yRot;
yRot = QQuaternion::fromAxisAndAngle(0.0f, 1.0f, 0.0f, horiAng * radiDeg);
 

- QRect 와 QRectF

 

QRect 클래스는 정수(Integer), QRectF는 실수(Float)를 사용해 사각형의 좌표 값을 저장 하기 위한 용도로 사용할 수 있다. 사각형의 X, Y, Width, Height 값을 저장 할 수 있다.

QRect r1(100, 200, 11, 16);
QRect r2(QPoint(100, 200), QSize(11, 16));
QRectF rf1(100.0, 200.1, 11.2, 16.3);
QRectF rf2(QPointF(100.0, 200.1), QSizeF(11.2, 16.3));
 

- QRegExp

 

QRegExp 클래스는 정규식 표현 기능을 제공한다.

QRegExp rx("^\\d\\d?$"); // 0~99 의 정수값인 경우
rx.indexIn("123"); // return -1
rx.indexIn("-6"); // return -1
rx.indexIn("6"); // return 0
 

- QRegion

 

QRegion은 QPainter::setClipRegion( ) 함수와 함께 사용한다. Painter 상에서 사각형 내부의 특정 영역을 사각형으로

클립보드로 사용하기 위해 다음과 같이 사용할 수 있다.

void MyWidget::paintEvent(QPaintEvent *)
{
    QRegion r1(QRect(100, 100, 200, 80), QRegion::Ellipse);
    QRegion r2(QRect(100, 120, 90, 30));
    QRegion r3 = r1.intersected(r2);
    QPainter painter(this);
    painter.setClipRegion(r3);

...
 

 

- QSize

 

QSize 클래스는 int 값을 이용해 width, height 를 저장하기 위해 주로 사용된다.

QSize size(100, 10);
size.rheight() += 5;
// size (100,15)
 

- QVariant

QVariant 클래스는 데이터 타입이 정해지지 않은 유형의 데이터 타입을 지정할 수 있는 기능을 제공한다.

 

예를 들어 void * 와 같이 지정할 수 있다.

QDataStream out(...);
QVariant v(123);   // int 형을 저장
int x = v.toInt(); // x = 123
out << v;
v = QVariant("hello");     // QByteArray 타입의 문자열을 저장
v = QVariant(tr("hello")); // QString 타입의 문자열을 저장
int y = v.toInt();
QString s = v.toString();
out << v;
... 

QDataStream in(...);
in >> v;
int z = v.toInt();
qDebug("Type is %s", v.typeName());
v = v.toInt() + 100;
v = QVariant(QStringList());
 

- QVector2D, QVector3D 그리고 QVector4D

 

QVector2D는 2D 좌표에서 Vector와 Vertex를 다루기 위해 사용된다. QVector3D는 X, Y

에 Z가 추가된 클래스이다. 그리고 QVector4D 클래스는 W가 추가된 기능을 제공한다.

...

    void
    GeometryEngine::initCubeGeometry()
{
    VertexData vertices[] = {
        // Vertex data for face 0
        {QVector3D(-1.0f, -1.0f, 1.0f), QVector2D(0.0f, 0.0f)},
        {QVector3D(1.0f, -1.0f, 1.0f), QVector2D(0.33f, 0.0f)},
        {QVector3D(-1.0f, 1.0f, 1.0f), QVector2D(0.0f, 0.5f)},
        {QVector3D(1.0f, 1.0f, 1.0f), QVector2D(0.33f, 0.5f)},
        // Vertex data for face 1
        {QVector3D(1.0f, -1.0f, 1.0f), QVector2D(0.0f, 0.5f)},
        {QVector3D(1.0f, -1.0f, -1.0f), QVector2D(0.33f, 0.5f)},
        {QVector3D(1.0f, 1.0f, 1.0f), QVector2D(0.0f, 1.0f)},
        {QVector3D(1.0f, 1.0f, -1.0f), QVector2D(0.33f, 1.0f)}...

...

void GeometryEngine::initCubeGeometry()
{
    VertexData vertices[] = {
        // Vertex data for face 0
        {QVector3D(-1.0f, -1.0f, 1.0f), QVector2D(0.0f, 0.0f)},
        {QVector3D(1.0f, -1.0f, 1.0f), QVector2D(0.33f, 0.0f)},
        {QVector3D(-1.0f, 1.0f, 1.0f), QVector2D(0.0f, 0.5f)},
        {QVector3D(1.0f, 1.0f, 1.0f), QVector2D(0.33f, 0.5f)},
        // Vertex data for face 1
        {QVector3D(1.0f, -1.0f, 1.0f), QVector2D(0.0f, 0.5f)},
        {QVector3D(1.0f, -1.0f, -1.0f), QVector2D(0.33f, 0.5f)},
        {QVector3D(1.0f, 1.0f, 1.0f), QVector2D(0.0f, 1.0f)},
        {QVector3D(1.0f, 1.0f, -1.0f), QVector2D(0.33f, 1.0f)},


...
 

 

 

8. Container Classes

 

Container 클래스는 특정 유형의 데이터를 집합 또는 배열 형태로 저장하는데 사용한다.

예를 들어 QString으로 저장해야 할 항목이 여러 개 있다면 QList과 같은 Container 클래스를 사용할 수 있다.

Container 클래스들은 STL에서 제공하는 Container들보다 사용하기 쉽고 안전하다. 또한 경량화 되어 있다.

 

따라서 Qt에서 제공하는 Container는 C++의 STL에서 제공하는 Container를 대체해 사용할 수 있다.

- QHash<Key,T>

 

QHash 클래스는 해시 테이블 기반의 Dictionary를 제공한다.

데이터를 저장하는 방식 은 Key, Value 가 Pair(쌍)로 저장 된다. Key 값으로 찾고자 하는 데이터를 빠르게 검색 할 수 있는 기능을 제공한다.

QHash는 QMap과 매우 비슷한 기능을 제공하지만 내부 알고리즘은 QMap 보다 빠르다.

QHash<QString, int> hash;
hash["one"] = 1;
hash["three"] = 3;
hash["seven"] = 7;
 

QHash에 Key, Value를 쌍으로 저장하기 위한 방법으로 insert( ) 함수를 사용할 수 있다.

그리고 Value 값을 알기 위해 value( ) 멤버 함수를 사용할 수 있다.

hash.insert("twelve", 12);
int num1 = hash["thirteen"];
int num2 = hash.value("thirteen");
 

 

 

- QMap<Key,T>

 

QMap의 사용 방법은 QHash와 유사하다. 다음 예는 QString을 Key 로 사용하고 int를 Value로 사용하는 예제 소스코드 이다.

QMap<QString, int> map;
map["one"] = 1;
map["three"] = 3;
map["seven"] = 7;
map.insert("twelve", 12);
int num1 = map["thirteen"];
int num2 = map.value("thirteen");
 

다음 예제는 Key 값을 이용해 Value 값을 얻어 오기 위한 방법으로 contains( ) 함수를 사용할 수 있다

int timeout = 30;
if (map.contains("TIMEOUT"))
    timeout = map.value("TIMEOUT");
 

 

- QList<Key,T>

 

QList는 빠른 인덱스 기반의 액세스가 가능하며 저장된 데이터 삭제도 매우 빠르다. QList는 인덱스 기반의 클래스이며 QLinkedList의 Iterator 기반보다 사용하기 편리하며 데이터 저장 시 메모리 할당하는 속도에서 QVector 보다 빠르다.

QList<int> integerList;
QList<QDate> dateList;
QList<QString> list = { "one", "two", "three" };
 

QList는 비교 연산자를 통해 리턴 값을 아래 예와 같이 사용할 수 있다.

if (list[0] == "Bob")
    list[0] = "Robert";
 

QList는 at( ) 함수를 이용하면 리스트 상에 저장된 위치를 쉽게 검색 할 수 있다.

for (int i = 0; i < list.size(); ++i)
{
    if (list.at(i) == "Jane")
        cout << "Found Jane at position " << i << endl;
}
 

<추가적인 QLIst 공부>

 

QList는 Qt 프레임워크에서 제공하는 템플릿 기반의 리스트 자료구조로, 다양한 데이터 타입을 빠르게 저장하고 인덱스로 접근할 수 있는 유용한 클래스입니다.

 

특히, 저장된 데이터에 대한 인덱스 기반 액세스빠른 삭제 작업을 지원합니다.

 

주요 특징:

 

인덱스 기반으로 리스트 내의 데이터에 빠르게 접근할 수 있습니다.

데이터 삭제메모리 할당이 빠르며, 특히 QLinkedList에 비해 사용하기 간편합니다.

QList는 QVector에 비해 메모리 할당 속도가 더 빠르지만, QVector는 메모리 활용 면에서 더 효율적일 수 있습니다.

 

예제 코드와 주석:

#include <QList>
#include <QString>
#include <iostream>

int main() {
    // QList는 다양한 데이터 타입을 저장할 수 있습니다.
    // 이 예시에서는 QString 타입을 저장한 QList를 생성합니다.
    QList<QString> list = { "one", "two", "three" };

    // 인덱스 연산자를 사용하여 리스트의 첫 번째 항목에 접근하고 값을 비교합니다.
    if (list[0] == "one") {
        // 리스트의 첫 번째 값이 "one"인 경우 "Robert"로 변경합니다.
        list[0] = "Robert";
    }

    // at() 함수를 이용하여 리스트 상의 데이터에 인덱스로 접근할 수 있습니다.
    for (int i = 0; i < list.size(); ++i) {
        // 리스트의 각 항목을 검사하여 "Jane"이라는 값을 찾습니다.
        if (list.at(i) == "Jane") {
            // 만약 "Jane"을 찾으면 해당 인덱스 번호를 출력합니다.
            std::cout << "Found Jane at position " << i << std::endl;
        }
    }

    return 0;
}
 

주석 설명:

 

리스트 생성 및 초기화:

QList<QString>을 생성하고 문자열 데이터를 저장합니다.

여러 타입의 데이터를 저장할 수 있으며, 예시에서는 QString 타입을 사용하고 있습니다.

QList<QString> list = { "one", "two", "three" };
 

인덱스 연산자 사용:

 

인덱스를 이용해 리스트에 저장된 데이터를 비교하고 수정할 수 있습니다.

여기서는 list[0]을 통해 첫 번째 항목에 접근해 값을 변경하는 예입니다.

if (list[0] == "one") {
    list[0] = "Robert";
}
 

at() 함수 사용:

 

at() 함수를 사용하여 리스트의 특정 위치에 있는 항목에 접근할 수 있습니다.

list.at(i)는 list[i]와 비슷하게 동작하지만, at() 함수는 읽기 전용으로 사용되는 점이 특징입니다.

if (list.at(i) == "Jane") {
    std::cout << "Found Jane at position " << i << std::endl;
}
 

for 루프를 통한 리스트 순회:

리스트의 크기를 list.size()로 확인하고, 각 항목에 대해 조건을 검사합니다.

이 예제에서는 "Jane"이라는 값이 있는지 확인하고, 있다면 해당 위치를 출력하는 구조입니다.

 

추가 설명:

 

QList는 내부적으로 동적 배열을 사용하며, 리스트의 크기가 커질 때 자동으로 메모리를 재할당합니다.

인덱스 기반 접근이기 때문에 순차적으로 데이터에 접근할 때 빠르며, 특히 데이터의 삽입/삭제가 빈번하게 일어나는 경우 적합합니다.

 

**QLinkedList**는 연결 리스트 기반으로 동작하지만, **QList**는 배열 기반이므로 사용하기 더 간편하고 속도도 빠릅니다.

 

이처럼 QList는 다양한 데이터 타입을 저장하고 빠르게 접근할 수 있는 강력한 자료구조로, Qt에서 리스트 형태의 데이터를 다룰 때 자주 사용됩니다.

 

 

 

728x90
반응형