记几个Qt相关的问题

我用Qt写程序也两年多了,主要是用这玩意做课程大作业、课程设计之类的玩意。期间遇到过很多奇怪的问题,这里做一下整理。

2017-01-31 更新
2016-12-18 更新

有毒的头文件

我在项目里定义了一个头文件 global.h,一开始工程可以正常地编译运行。但是当多个其他的头文件开始包含global.h的时候,奇怪的时候开始出现了,编译运行各种报错,大概意思就是符号Undifined,特别是global.h文件里的变量怎么也找不到,但是语法高亮又是正常的。折腾一通后,发现是global.h的预处理头的问题:

#ifndef GLOBAL_H
#define GLOBAL_H
/** src **/
#endif

发现GLOBAL_H这个宏很可能在Qt内部的头文件中被定义过了,所以只要把GLOBAL_H换一个名字就行了,可是这是Qt自动帮我生成的啊,好坑爹。

神奇的重构功能

一旦项目中文件多了之后,想要给某个变量或方法进行重命名,手动操作出错概率太高,免不了要用IDE提供的重构(Refactor)功能。Qt这玩意的变量重构似乎不是基于语法树分析的,好像只是在文本层面进行批量替换。

我为什么这么猜测呢,因为我遇到过一件坑爹事。有一次工程里有一个变量名比较特殊,大概是像qstring、os、process之类的变量名,具体叫什么我不记得了,我对这个变量名进行重构后,Qt似乎重构了好久,等重构完成后,发现这个Qt的构建套件已经报废了,无论编译构建什么工程,都会报错,而且错误来源都是Qt自己的头文件。

后来我也是折腾了半天,百思不得其解,怀疑是那次重构Qt把自己的内部头文件里的变量名也给重构了(内部头文件中存在变量刚好和我要重构的这个变量名相同)。后来我重新下载了一个Qt,手动把那个敏感的变量重新命名了一下,问题就解决了。

QAbstractButton的类型转换问题

实例化一个对话框QMessageBox,添加自定义的按钮。代码写法如下:

    QMessageBox box;
    box.setWindowTitle("标题");
    box.setText("文字");
    QPushButton *connectButton = box.addButton(tr("确定"), QMessageBox::ActionRole);
    QPushButton *abortButton = box.addButton(tr("取消"),QMessageBox::ActionRole);
    box.exec();

    QAbstractButton* btnClicked = box.clickedButton();
    QPushButton* btn = dynamic_cast<QPushButton*>(box.clickedButton());
    QPushButton* btn = qobject_cast<QPushButton*>(box.clickedButton());
    if (btn == connectButton){
        this->close();
    } else if (btn == abortButton){
        ;
    }

但是实际上QMessageBox的clickButton()方法返回的是QAbstractButton*类型,因此需要进行类型转换,因为QAbstractButton是QPushButton的基类,因此我用的是dynamic_cast。然而我惊讶地发现这样写会报错:

然后我又试了一下qobject_cast,也不行,最后直接用(QPushButton*)ptr 强转了。我至今也没搞懂为什么无法进行转换。

不稳定的插件

Qt里面有一个Fake Vim,我就试用了一下。那一次打算在头文件里输入一个 #include 语句,结果忘了自己在用Vim,习惯性地打出了第一个字符 # 。 当时Vim不在编辑模式,按理来说对这个输入应该是没有响应的,结果Qt就崩溃了,没有保存的修改也丢失了。

自从那次之后,我就不敢用Qt的Fake Vim了。那还是一年多前的事,现在Qt也更新了好多版本,不知道问题修复了没有。

动态补充中

其实应该还有不少奇怪的问题,不过已经记不太清楚了,下次遇到再补充到Qt里来。

其实从以上的文字看我似乎在吐槽Qt,但其实我个人还是比较喜欢用Qt的。IDE用起来还是比较顺手的,至少比VS要顺手得多。Qt的信号-槽机制我也很喜欢,很多类之间通信的代码写起来方便多了,不用写一堆麻烦的回调。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容