由于工作需要, 開始學習Qt. 這里記下一些筆記, 方便以后查閱(隨時更新).
1.用Qt Creator創建一個基于GUI的應用程序, 選擇基類有QWidget, QDialog, QMainWindow三種. 發現一個問題, 當選擇用QWidget, QDialog時, 可以直接在派生類的構造函數里創建控件添加到布局管理器對象, 然后調用setLayout(布局管理器對象)就可以在界面顯示創建好的控件了; 然而選用QMainWindow作為基類的時候, 這樣操作卻沒有顯示出控件來. 經過百度, 發現原來派生類還要創建一個QWidget對象, 把布局管理器放到這個QWidget對象上面, 然后把這個QWidget對象作為參數調用setCentralWidget就可以正常顯示控件了.
2.解決Qt中顯示中文亂碼的方法, 這里直接添加兩個方法的調用:
QTextCodec::setCodecForTr
(QTextCodec::codecForLocale
()); QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale());
3.窗口樣式
setWindowFlags(Qt::FramelessWindowHint); //去掉窗口邊框標題
4.md5加密
Qt中使用MD5加密
QCryptographicHash test(QCryptographicHash::MD5);
QByteArray data;
data.append(tr("test"));
test.addData(data);
QByteArray result = test.result();
result.toBase64(); //密文用base64編碼
result.toHex(); //用16進制顯示數據
5.使用多線程
繼承QThread, 重寫run虛方法, 如果使用線程事件循環, 在run里面使用QObject對象并用connect關聯信號, 需要在構造函數里調用
moveToThread
(this);否則slots槽還是在主調線程中被調用而不是在新創建的線程中執行的.
6.wchar_t* 轉QString
wchar_t* wptr = L"test";
QString ret = QString::fromWCharArray(wptr);
QString ret2 = QString((QChar*)wptr, wcslen(wptr));
QString 轉wchar_t*
wchar_t szBuf[1024];
QString str = tr("hello");
wcscpy_s(reinterpret_cast<wchar_t*>(szBuf),
sizeof(szBuf) / sizeof(wchar_t),
reinterpret_cast<const wchar_t*>(str.utf16()));
7.
QTreeView 設置列寬度固定
QTreeView()::header()->setResizeMode(QHeaderView::Fixed);
8.對話框屏幕居中顯示
quint32 scrwidth = QApplication::desktop
()->width
(); quint32 scrheight = QApplication::desktop()->height();
quint32 width = this->width();
quint32 height = this->height();
this->move((scrwidth - width) / 2, (scrheight - height) / 2);
9.發送信號的時候, 一些類型作為參數, 需要注冊:
Q_DECLARE_METATYPE(類名)
qRegisterMetaType<類名>("類名");
類名也可以是結構體等其他結構
10.rcc資源文件
bin目錄下有個rcc.exe工具, 可以吧qrc腳本編譯成rcc資源2進制文件, 命令如下:
rcc -binary xxx.qrc -o xxx.rcc
在程序中引用這個rcc資源文件:
QResource::registerResource("xxx.rcc");
卸載
QResource::unregisterResource("xxx.rcc")