WinForm 환경에서 Qt 프레임워크로 전환할 때 개발자가 가장 먼저 체감하는 장벽은 비즈니스 로직이 아니라 UI 컴포넌트의 명명 규칙과 속성 제어 방식입니다. WinForm은 비주얼 디자이너의 속성 창을 통해 직관적으로 설정하는 반면, Qt는 코드 상에서 열거형(Enum)과 메서드를 활용해 세밀하게 제어하는 접근 방식을 취합니다.
1. 주요 UI 컴포넌트 매핑 테이블
WinForm과 Qt의 기본 위젯 대응 관계 및 주요 속성 차이를 정리한 표입니다. Qt는 기본적으로 QWidget을 상속받는 클래스들로 구성됩니다.
| 역할 | WinForm 컴포넌트 | Qt 위젯 | 주요 속성 및 메서드 차이 |
|---|---|---|---|
| 텍스트 표시 | Label |
QLabel |
Text 속성 대신 setText() 및 text() 사용 |
| 단일 행 입력 | TextBox |
QLineEdit |
비밀번호 마스킹은 setEchoMode()로 처리 |
| 다중 행 일반 텍스트 | TextBox (Multiline) |
QPlainTextEdit |
로그 출력 등 대용량 텍스트 처리에 최적화 |
| 서식 있는 텍스트 | RichTextBox |
QTextEdit |
HTML 태그 렌더링 및 서식 지원 |
| 클릭 액션 | Button |
QPushButton |
Click 이벤트 대신 clicked 시그널 사용 |
| 다중 선택 | CheckBox |
QCheckBox |
상태 확인은 isChecked() 메서드 활용 |
| 단일 선택 | RadioButton |
QRadioButton |
상호 배타적 선택을 위해 QGroupBox와 결합 권장 |
| 드롭다운 목록 | ComboBox |
QComboBox |
항목 추가 시 addItem() 또는 addItems() 호출 |
| 수치 증감 | NumericUpDown |
QSpinBox |
현재 값 변경은 setValue()로 수행 |
| 단순 목록 | ListBox |
QListWidget |
데이터 모델 없이 간단한 리스트 구현에 적합 |
| 데이터 그리드 | DataGridView |
QTableWidget |
Qt는 단순 위젯(Widget)과 모델-뷰(View) 아키텍처를 명확히 구분 |
2. 핵심 속성 제어 방식 비교
Qt에서는 속성을 변경할 때 set[Property]() 형태를, 값을 읽을 때는 [property]() 형태를 사용하는 것이 표준입니다.
A. 입력 필드의 보안 및 힌트 텍스트 (QLineEdit)
WinForm에서 PasswordChar를 설정하던 방식은 Qt에서 EchoMode 열거형으로 대체됩니다. 또한, 플레이스홀더(워터마크) 설정이 기본적으로 제공됩니다.
// 비밀번호 입력 모드 활성화 및 플레이스홀더 설정
QLineEdit *userPasswordInput = new QLineEdit(this);
userPasswordInput->setEchoMode(QLineEdit::Password);
userPasswordInput->setPlaceholderText("비밀번호를 입력하세요");
B. 버튼의 시각적 상태 및 동작 (QPushButton)
폼의 기본 엔터 키 동작을 할당하거나, 테두리 없는 플랫 디자인을 적용하는 방법입니다.
// 폼의 기본 동작 버튼 지정 및 플랫 스타일 적용
QPushButton *confirmActionButton = new QPushButton("확인", this);
confirmActionButton->setDefault(true);
confirmActionButton->setFlat(true);
C. 텍스트 레이블의 줄바꿈 및 정렬 (QLabel)
WinForm의 AutoSize와 달리, Qt는 명시적으로 단어 줄바꿈을 활성화해야 하며, 정렬 옵션을 세밀하게 조정할 수 있습니다.
// 텍스트 자동 줄바꿈 및 중앙 정렬 설정
QLabel *descriptionTextLabel = new QLabel("이것은 매우 긴 설명 텍스트입니다.", this);
descriptionTextLabel->setWordWrap(true);
descriptionTextLabel->setAlignment(Qt::AlignCenter);
3. 이벤트 처리 패러다임: 시그널과 슬롯 (Signals & Slots)
WinForm에서는 컨트롤을 더블 클릭하여 EventHandler 델리게이트를 생성하지만, Qt는 시그널(Signal)과 슬롯(Slot)이라는 독자적인 통신 메커니즘을 사용합니다.
- 시그널: 위젯에서 발생하는 이벤트(예:
clicked,textChanged). - 슬롯: 시그널을 수신하여 실행되는 일반 C++ 멤버 함수.
Qt Designer를 활용한다면, 위젯을 우클릭 후 'Go to slot...' 메뉴를 선택하여 WinForm과 유사하게 자동으로 슬롯 함수 스켈레톤을 생성할 수 있습니다.
4. 반응형 UI를 위한 레이아웃 매니저
WinForm 개발자들이 Qt로 넘어올 때 가장 적응하기 어려운 부분이 레이아웃입니다. WinForm은 Anchor와 Dock 속성을 이용해 절대 좌표 기반의 상대적 위치를 조정하지만, Qt는 레이아웃 매니저(Layout Manager)를 통한 유동적 배치를 강력히 권장합니다.
QHBoxLayout: 위젯을 수평 방향으로 나열.QVBoxLayout: 위젯을 수직 방향으로 나열.QGridLayout: 행과 열로 구성된 그리드 형태 배치.
창 크기가 변경될 때 위젯이 자연스럽게 리사이징되기를 원한다면, 절대 좌표(X, Y)를 계산하지 말고 위젯들을 레이아웃 컨테이너에 할당한 후 부모 위젯에 레이아웃을 적용하면 됩니다.
5. UI 스타일링: 속성 창 대신 QSS 활용
WinForm에서는 배경색이나 글자색을 변경할 때 속성 창의 Color 피커를 사용하지만, Qt에서는 CSS와 거의 동일한 문법을 가진 QSS (Qt Style Sheets)를 사용하는 것이 표준입니다. 이를 통해 훨씬 더 유연하고 일관된 디자인 시스템을 구축할 수 있습니다.
// QPushButton에 그라데이션 및 테두리 스타일 적용
QPushButton *styledActionButton = new QPushButton("스타일 적용", this);
styledActionButton->setStyleSheet(
"QPushButton {"
" background-color: #2E86C1;"
" color: white;"
" border: 2px solid #1B4F72;"
" border-radius: 8px;"
" padding: 5px;"
"}"
"QPushButton:hover {"
" background-color: #3498DB;"
"}"
);