独钓寒江雪

用C++的优雅,驯服Windows的狂野

在日常生活中,我们不仅需要记忆6位数字的银行卡密码,还需要记忆各式各样网站和应用的账号密码,可能我们自己也不记得曾经注册过多少个账号。账号和密码如此繁多,管理这些账号和密码,也是一个让人头疼的问题。

最原始的方法是将密码写纸上,放在一个安全的地方,但纸张存在丢失、损坏的风险,而且不方便存取。

改进版则是将纸张电子化,如 Excel,并辅以云盘实现多端同步,这样虽然存取便利性上有一定的改善,但安全性却降低了很多,如果云盘没有历史版本功能,在编辑时稍有失误,可能导致密码全部丢失,另外如果云盘密码泄露、电脑中毒或系统损坏,也可能导致密码泄露或丢失。如果某一天云盘软件突然倒闭了,该怎么办呢?

目前已经有很多账号密码管理软件,来帮助人们管理账号和密码,如 1Password、KeePass 等,但它们也或多或少存在一些缺陷:

阅读全文 »

C++异常所带来的问题

当我们在代码中写下一行 throw 语句时,我们就此埋下了一个祸根,从此以后,在该函数调用链中,必须至少有一个调用者需要提供相应的异常捕获,否则一旦异常被抛出,程序就会异常终止。

例如,函数 f() 调用 g(),而 g() 又调用 h(),并且 h() 抛出一个异常,则 g() 和 f()中必须有一个提供了相应的异常捕获,否则程序会异常终止。

由于异常会使代码的执行流程从任意地方跳出,因此我们还需要付出大量的精力来编写正确的异常安全代码,例如使用 RAII(资源获取即初始化)来保证资源正确释放。

如下面的示例,虽然我们在函数 f() 中捕获了异常,避免了程序的异常终止,但异常却中断了函数 g() 的正常执行流程,导致对象 m 没有被正确释放,从而出现了资源泄露。这种情况可能还会变相地增加了程序的调试难度。

阅读全文 »

《红楼梦》第五十回中,一夜大雪后,贾府大观园的姐妹们一起作诗,众姐妹要王熙凤为即景联诗起个头。王熙凤虽只识得几个字,倒也不扭捏,笑道:“我想下雪必刮北风。昨夜听见了一夜的北风,我有了一句,就是‘一夜北风紧’,可使得?”众人听了,都相视笑道:“这句虽粗,不见底下的,这正是会作诗的起法。不但好,而且留了多少地步与后人”。

阅读全文 »

在 Qt 2D 世界中,图形基本都由点、线、矩形、多边形、椭圆、圆、折线、曲线、文本、贴图等基本元素辅以着色而构成,而且 QPainter 类已经提供了这些元素的绘制方法,花点时间掌握这些方法,也就掌握了 Qt 2D 图形控件的制作,余下的就是勤学多练、孰能生巧了。

阅读全文 »

软件是对现实世界的抽象,在设计软件接口时通常也会参考现实世界来进行设计。

在现实世界中,画家使用画笔、画刷这些工具在宣纸上作画,而在 Qt 中,画家是 QPainter 对象(画家的大脑则是 QPaintEngine),纸张可以是 QPaintDevice 的任何子类对象,如 QWidget、QImage、QPixmap、QGLPixelBuffer 等;在 QPainter 选好纸张后,就可以使用画笔来勾勒物体的轮廓了,Qt 中的画笔是 QPen 对象;画完轮廓后,可能还需要使用画刷来填充轮廓,Qt 中的画刷是 QBrush 对象。

阅读全文 »

Qt 中提供了强大的 2D 绘图系统,可以使用相同的 API 在屏幕和绘图设备上进行绘制,主要基于 QPainter、QPaintDevice 和 QPaintEngine 这三个类实现,其中:

  • QPainter 执行具体的绘图操作,QPainter 类提供了大量的 GUI 编程所需的函数,如 drawLine、drawImage 等。
  • QPaintDevice 是一个基类,提供绘图设备的抽象接口,它是一个二维空间的抽象,可以使用 QPainter 在其上进行绘制,常见的继承该类的绘图设备有 QImage、QPixmap、QWidget、QOpenGLPaintDevice 等。
  • QPaintEngine 提供了一些抽象接口,用于实现 QPainter 在不同的设备上进行绘制。QPaintEngine 由 QPaintDevice 创建并管理。
阅读全文 »

如果界面所指定的字体在用户系统上未安装,则会自动降级到系统默认字体,这样会导致界面显示异常或达不到预期效果。

对于特殊字体我们通常会集成到软件安装包内,但对于汉字这样的语言,它的文字比较多,因此字体文件比较大,如果集成到安装包内会导致安装包体积变大,所以对于类似中文这样字符比较多的语言字体,我们通常会选择系统自带的字体。

而不同操作系统(如Windows和macOS)所自带的字体不一样,甚至同一操作系统不同的版本(如Windows 7和Windows 11)自带的字体也不一样,因此在选择采用什么字体前,需要弄清我们应用程序支持的操作系统所自带的字体都有哪些,才能更好的做选择。

操作系统的新版本通常只会新增字体,不会移除老的字体。

阅读全文 »
0%