Qt是我唯一使用过/使用的编写图形程序的库。虽然我编写的图形程序很少且都很简单,不过由于实在没什么经验,一来二去也碰壁数次。在这里将自己吃过的亏总结一下,既供备忘,又可为后来者提供一些经验。
元件的尺寸与布局管理
布局管理是个好东西,不过有些问题要注意。首先,如果没有人为干预的话,布局管理是在这个窗口真正显示出来的时候才生效的,也就是说如果是用自定义类来继承QWidget/QMainWindow的方法做窗口,在类的初始化阶段它还没有生效,此时取到的元件长宽等属性和窗口真正显示的时候是不一样的。必要时考虑使用QLayout::update()和QLayout::activate()来强制更新布局。
QString与编码
编码是个讨厌的问题……然而作为中国人,在UTF统一世界之前是没有可能回避得过去的。
QString内部采用UTF-8编码,那么源码一律使用UTF-8就没问题了吧?很遗憾,如果在源代码用C风格字符串来初始化的话,不论源码本身的编码是什么,Qt默认都会调用QString::fromAscii(),把字符串当成ASCII来处理。所以无论使用GBK、BIG5还是UTF-8,最后中文存进去全都是错的。正确的办法是手动调用fromUtf8()、fromLocal8Bit()等等,在建立之初就转换好。也可以在全局使用QTextCodec::setCodecForCStrings(QTextCodec::codecForName(“GB2312”));或者QTextCodec::setCodecForCStrings(QTextCodec::codecForName(“UTF-8”));
来为整个程序一劳永逸地设计编码。
拿什么显示图片?
如果我有一张图片需要显示在窗口中,应该拿什么元件来装?直观地想应该是QWidget,然而实际使用的时候却发现QWidget居然没有setPixmap(),虽说用setPalette或者setStyleSheet之类的方法也能实现,不过太不优雅。其实正确的做法是使用QLabel。QLabel的方法是明确写在文档里的,不过为啥会是用QLabel我一直搞不太懂……而且,似乎同一个QLabel不能同时既显示图片又显示字。
QPixmap的使用
首先,QPixmap必须在QApplication的实例创建之后才能使用。这个问题会有明确的错误提示,不过最好还是早发现造解决,不要到后来数据结构都设计好了最后还要重构……
还有一个问题需要注意……QPixmap在主线程以外使用是不安全的。这一点我一直没想明白,不过既然Qt这么说了,若非不得已,就这么用吧……