坐標系統
物理坐標,是指顯式出來的;邏輯坐標是不會變化的。
信號槽
signal 類似廣播,發出一個信號,感興趣的對象使用connect函數來連接這個信號,然后,使用自己的一個函數作為slot(槽)處理這個信號,回調槽函數。
信號就是一個函數,返回值為void,參數為想傳遞出去的值,信號不需要實現代碼,是Qt的一種特性,
MainWindow
對象類型
QObject是以對象樹的形式組織起來的。當你創建一個QObject對象時,會看到QObject的構造函數接收一個QObject指針作為參數,這個參數就是 parent,也就是父對象指針。這相當于,在創建QObject對象時,可以提供一個其父對象,我們創建的這個QObject對象會自動添加到其父對象的children()列表。當父對象析構的時候,這個列表中的所有對象也會被析構。(注意,這里的父對象并不是繼承意義上的父類!)這種機制在 GUI 程序設計中相當有用。例如,一個按鈕有一個QShortcut(快捷鍵)對象作為其子對象。當我們刪除按鈕的時候,這個快捷鍵理應被刪除。這是合理的。
盡量指定parent指針,盡量在堆上創建.
QPushButton quit("quit");
QWidget window;
quit.setParent(&window);
C++標準規定局部變量按照棧的順序析構,即先創建的后析構。這段代碼會導致程序崩潰,因為quit被析構了2次。
Dialog
Qt的模態和非模態是由Qt::WindowModal這個屬性決定的,默認為false,exec()方法執行的時候會使得這個屬性變為true,返回的時候又變回false。
Qt5新式信號槽寫法
Qt4使用SIGNAL和SLOT兩個宏來連接信號槽,在Qt5中使用函數指針的形式,這是為了使得問題暴露在編譯期。
對于有重載的信號,要顯式指定調用的是哪個信號,最好使用下面這這種形式,而不是C風格的強制轉換。
QObject::connect(&newspaper,
static_cast<void (Newspaper:: *)(const QString &, const QDate &)>(&Newspaper::newPaper),
&reader,
&Reader::receiveNewspaper);
帶默認參數的槽函數用Qt5來寫需要使用Lambda函數來寫。
事件
如果我們使用組件,我們關心的是信號槽;如果我們自定義組件,我們關心的是事件。
當重寫事件回調函數時,時刻注意是否需要通過調用父類的同名函數來確保原有實現仍能進行!
事件的傳播是在組件層次上面的,而不是依靠類繼承機制。
accept表示事件對象想要處理這個事件,停止事件傳播;ignore表示事件對象不想處理這個事件,會在事件的處理鏈上繼續找尋另外的接收者。
Qt 做了特殊的設計:事件對象默認是 accept 的,而作為所有組件的父類QWidget的默認實現則是調用ignore()。
安裝了事件過濾器的控件收到的所有事件會被發送到事件過濾器處。
qglobal.h,這個文件中控制了Qt具體的某一模塊
qobject_cast
T qobject_cast ( QObject * object )
本方法返回object向下的轉型T,如果轉型不成功則返回0,如果傳入的object本身就是0則返回0。
在使用時有兩個限制:
1.T類型必須繼承自QObject。
2.在聲明時必須有Q_OBJECT宏。
qt迭代器
qt迭代器訪問findChildren返回的qlist的時候會重置控件,不知道為什么。TODO
qt繪制
沒有父控件的控件被稱為窗口,
qt多線程
QThread只有run函數是在新線程里的
QGraphicsScene
removeItem()
:不會刪除item的內存,item的內存管理由程序員來負責
clear()
:會remove所有item并刪除內存。
addItem()
:添加到scene里
M/V結構
委托:
QT 布局
1、水平布局
CTRL+鼠標左鍵選中要布局的控件,CTRL+H 水平布局;
2、垂直布局
CTRL+鼠標左鍵選中要布局的控件,CTRL+L 垂直布局;
3、布局后預覽
ALT+SHIFT+R
4、添加空格,優化布局
添加Spacers控件
5、設置固定窗口大小
進入widget.cpp 構造函數-》this->setMaximumSize(xxx,xxx); this->setMinimumSize(xxx,xxx);