Qt의 hello world는 여기로.
Object Trees & Ownership 문서에 따르면 모든 QObject는 트리 형태를 이루고 있다. 어떤 객체를 생성할 때, QObject는 새로 생성된 객체에게 기존의 어떤 객체를 parent로 삼을 것인지 명시하도록 디자인되어 있다. 그 말은 모든 동적 생성된 객체들이 메모리 누수 없이 올바르게 해제됨을 보장한다는 것이다. Qt 프로그램을 디자인할 때 항상 모든 프로그램이 최상위 QObject인 main.cpp에서 생성되는 최초의 QObject를 조상으로 삼아라.
객체를 힙에 생성할 때는 문제가 없으나, 스택에 생성할 때는 조심해야 한다. 소멸자의 순서는 생성자의 순서 반대로 불리게 되어 있기 때문에 부모를 먼저 생성하고 자식을 나중에 생성하면 분명히 문제가 발생한다. QObject를 스택에 생성할 경우 주의할 것.
“The Property System.” 감동적임! Meta-Object System을 이용하여 getter/setter를 마치 C#의 property 처럼 사용할 수 있다. 게다가 값이 변할 때 마다 signal 까지 날려 줄 수 있다.
boost::shared_ptr과 작별할 때가 왔다. Qt에서도 자동으로 레퍼런스 카운팅을 해 주는 스마트 포인터 라이브러리가 제공된다.
QPointer는 'dangling pointer'의 위험으로부터 우리를 해방시켜 주는 멋진 스마트 포인터다. 그냥 포인터와 마찬가지지만 이 녀석은 객체가 해제되면 자신도 0를 레퍼런스한다.
QPointer<QObject> qp = some_instance_out_of_my_control; ... (some_instance_out_of_my_contorl is deleted) ... if (qt) { // saviour!! ... }
단, 조건은 T는 QObject를 상속 받아야 한다.
레퍼런스 카운팅이 되는 포인터. 그러니까 boost::shared_ptr과 동일하다. Qt 라이브러리를 쓰면서 굳이 이유 없이 boost까지 써서 라이브러리의 의존성을 높일 필요는 없다. QSharedPointer Class 문서 참조.
QScopedPointer는 훨씬 가벼운 포인터다. 힙에 생성되나, 마치 스택에 생성되는 지역 변수처럼 객체를 생성해 사용할 수 있는 장점이 있다. 클래스 멤버 변수인데, 동적으로 사용하고 싶을 때는 이 스마트 포인터를 사용해 보자.
PythonQt는 파이썬 스크립트를 C++에 임베딩하는 또 하나의 수단이다. 정말 boost::python과 이별할 때가 온 것 같다.
SignalsAndSlots 항목에서 설명.
Thread 항목에서 설명.