최초 생성 시각: 2023-06-23 04:14:40
최근 수정 시각: 2023-06-24 20:40:03
Qt의 핵심기술 중 하나 => signal & slot
우리가 앞서 만든 button에 어떤 일을 할 수 있게 하는것.
버튼 객체가 click할 때, window 멤버함수를 호출하는 행위
따라하기식 코드 만들기
Signal & Slot 코드 만들기
slots
이라는 키워드를 적어줘야함.QObject::connect(/* 해당 객체 */, /* Signal */, /* slot을 가진 객체 */, /* SLOT 정보 */);
혹시 소스코드에 이상이 없는데 compile error 나면 => build clean 해봐라.
QPushButton의 signal
toggled
pressed
released
clicked
위와 같이 4개의 signal이 존재함. 근데 이렇게 class마다 어떤 버튼 signal이 있는지 어떻게 아니? => 공식문서를 참조 해봐야함.
QWidget <– QAbstractButton <– QPushButton
저런 시그널을 어떻게 만들지? => 이것도 가능함.
slot
public 에 있는 멤버함수에 불가함. 사용자가 직접 부를 수 있다. QT Signal&Slot 개념으로 연결도 가능한 것임.
QWidget의 close()
함수가 있다. 이 함수는 window를 닫을 때 사용함. 해당 함수는 slot으로 구현되어져있음. 따라서, 직접부르는 것도 가능하지만 slot을 활용하기도 함.
QObject::connect( btn, SIGNAL(clicked()), this, SLOT(close()));
다이얼로그로 닫겠다하면 위와 같이 사용하면 됨.
임의 클래스가 signal slot을 사용하려면
Q_OBJECT
메크로 추가.시그널 슬롯은 GUI가 아니라도 가능하다.
Slot을 만들기 위해서는 멤버함수 접근지정자 뒤에 slots
를 적어주면 됨.
Signal을 만드는 방법
Signals:
키워드를 적어주고, 선언만 작성! (구현부는 작성하면 안됨)emit
키워드를 활용하면 된다.Signal slot을 연결하는 방법은 2가지가 있다.
하나의 시그널에 여러개의 slot을 붙여서 사용가능함
QT는 C++과 긴밀한 관계가 있다.
QT의 탄생
MOC가 컴파일하는 코드들은 아래와 같다.
위와 같이 동작하는 걸 MOS (Meta Object System) 이라고 부른다.
MOS를 사용하려면 지켜야하는 규칙이 있다.
편하게 추가하기 위해서는 => Add clas를 하면 더 편하게 추가할 수 있음. 멤버함수 추가도 Refactor를 하면 더 편하게 할 수 있음.
실행시간에 객체 타입을 조사하는 기술
C++ 표준 문법이 제공하지만, QT도 자체기술로 제공한다.
Sample sam;
const QMetaObject* mo = sam.metaObject();
// 메타 오브젝트 안에 다양한 결과들이 있음.
qDebug() << mp->className();
MOS를 돌리게 되면, Q_OBJECT와 같은 메크로가 변환되는데, 해당 값은 선언만 존재함. 이 구현을 누군가는 해야되는건데.. 그걸 MOC가 해줌.
Q_OBJECT를 가장 위에 놓는 이유 => 내부적으로 private
를 마지막에 포함하기 때문에.. -> public위에 놓아라!! 전처리해보면 알 수 있음.
자식 윈도우를 만든 경우 위치 / 크기를 적절하게 배치해야한다.
QBoxLayout::LeftToRight
QBoxLayout::RightToLeft
QBoxLayout::TopToBottom
QBoxLayout::LeftToRight
setSizePolicy
라는 정책을 가지고 있음.btn->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expandig);
// QSizePolicy::fixed; 이것을 사용하면 사이즈가 고정됨.
QGridLayout
은 자식 widget을 Row, col 형식 즉, 격자형식으로 배치하는 것을 말함.
QFormLayout
은 addRow()
함수를 사용해서 줄단위 항목 추가 가능한 layout.
QObject <- QWidget <- QMainWindow
RTTI
, Signal&Slot
갖고 있음.QMainWindow로 그리면 menu 같은 것들이 붙어있어서 좀 더 편하게 Window를 그릴 수 있음.
QWidget은 UI공통 사항이라 window 관련된 것을 붙여서 사용해야함.
공감하기