Qt编程新手躬行经验记(持续更新?)

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这么说了,若非不得已,就这么用吧……

自制快速调节鼠标灵敏度的小玩意——SimpMouse

simpmouse_pic

介绍:

这是我最近弄的小玩意,可以识别连接的鼠标,并分别调节每个鼠标的“减速系数”(Constant Deceleration)。

代码托管在Github上:
https://github.com/ukyoi/simpmouse (点此进入项目页面)
欢迎fork和贡献(虽然我觉得应该没什么人fork)。

功能上,选中要调节的鼠标,然后拖动滑杆或输入数值,就可以改变鼠标灵敏度。由于减速系数取值是1到正无穷(应该是正无穷吧……),所以滑杆那里我取了个倒数,左端对应数值为16。直接输入的话则可以接受任何有效的数值。

另外,虽然有Refresh、Apply和Cancel三个按钮,不过这些都是半年前构想中的功能,现在统统用不了,当然更无什么记忆功能。总之只是个很简陋的半成品。

主要用到的东西:Qt做界面、C++、Qt做基本功能(使用qmake进行构建)。
通过运行 xinput list 和 xinput list-props 获取鼠标信息,并用 xinput set-prop 写入Constant Deceleration数值。

关于这个程序的一些废话:

最初想法源于半年前跟人联网用wine玩星际。KDE的鼠标调节功能比较残,指针加速那里即使调到最低,我的鼠标也还是太灵敏(xfce的鼠标调节就很好,可以每个鼠标独立调整,项目也多)。网上查到用xinput可以对鼠标行为进行精细调节,我就打算写个方便的图形工具来用。结果一下拖到现在,星际自然是早就不打了,程序也变成了练手(自娱自乐)之作。至于程序名……由于这个程序对多数人来说实在是没啥大用,请原谅我没在上面花什么心思。

我本以为如此小程序,不会有什么代码量,然而最终代码量却出乎我的意料。当然回报也是有的,我的最大收获大概在于对如何组织程序的结构有了一些经验。我之前只是看过一些编程语言的教材和简单的算法,而对哪怕一个很小的程序应该如何设计和组织则全无经验。通过边写这个程序边进行重构,我对代码该怎么划分、怎么组织都有了一些粗浅的了解。虽然程序本身很小,但我自认为带来的收获还是可观的吧。

Fcitx皮肤查看器

虽说私很懒,不过不忙的时候还是会捣鼓一些东西的,这Fcitx皮肤查看器就是私最近主要在弄的一个。工程方面基本是CSSlayer仁兄打的底子。
配置读取部分是直接调用Fcitx的API,且貌似Fcitx4.1的皮肤配置有所更改,因此应该至少要求Fcitx版本号高于4.1。
虽说只有最基本的功能,输入框还没有写好,边栏还只是把东西一股脑地显示出来,不过大体的形态已经有了,先发出来做个预告。

Fcitx皮肤浏览器
Fcitx皮肤查看器

有兴趣的且有Qt的人可以从github上抓下来玩玩(虽然我认为应该没多少人有兴趣……):
git@github.com:csslayer/fcitx-skin-viewer.git