由于工作需要, 开始学习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")