• 1634阅读
  • 3回复

[原创]Qt开发经验小技巧156-160 [复制链接]

上一主题 下一主题
离线liudianwu
 

只看楼主 倒序阅读 楼主  发表于: 2021-06-17
156. Qt的UI界面在resize以后有个BUG,悬停样式没有取消掉,需要主动模拟鼠标动一下。
```cpp
void frmMain::on_btnMenu_Max_clicked()
{
    ......

    //最大化以后有个BUG,悬停样式没有取消掉,需要主动模拟鼠标动一下    
    QEvent event(QEvent::Leave);
    QApplication::sendEvent(ui->btnMenu_Max, &event);    
}
```

157. 项目中启用c++11语法支持。
```cpp
greaterThan(QT_MAJOR_VERSION, 4): CONFIG += c++11
lessThan(QT_MAJOR_VERSION, 5): QMAKE_CXXFLAGS += -std=c++11
```

158. Qt的文本控件比如QTextEdit默认加载大文本比如10MB的文本,很容易卡死甚至崩溃,那是因为默认一个属性开启了,需要屏蔽掉就好很多。
```cpp
ui->textEdit->setUndoRedoEnabled(false)
```

159. 其他几点常规小经验,本人在这几个地方摔跤过很多次。
- 有返回值的函数,一定要主动return返回值,有部分编译器在没有返回值的情况下也能正常编译通过,但是运行的时候会出问题,得不到想要的结果,因为没有return对应的值。
- 定义的局部变量,主动给定个初始值,是个必须养成的好习惯,不然编译器给的初始值很可能不是你想要的,比如int变量默认0,有时候随机变成一个很大的数值,bool变量的初始值不同编译器不同值,有些是true有些是false,主动给一个初始值更可靠。
- 某些函数参数很多,而且后期可能还会修改和增加,这就导致了源头修改以后,关联信号槽的地方也要修改,参数类型和位置必须保持完全一致,对应槽函数处理也要修改等,改动的工作量非常大而且极不友好,所以对于非固定参数的函数,建议用结构体,这样非常容易增加其他的参数,而且不用修改信号槽关联和信号槽函数定义等,比如学生信息表、商品信息表作为参数传输,最佳方案就是结构体。

160. QTabWidget选项卡控件,生成的tabbar选项卡宽度是按照文本自动设置的,文本越长选项卡的宽度越大,很多时候,我们需要的是一样的宽度或者等分填充,
```cpp
//方法1:字符串空格填充
ui->tabWidget->addTab(httpClient1, "测    试");
ui->tabWidget->addTab(httpClient1, "人员管理");
ui->tabWidget->addTab(httpClient1, "系统设置");

//方法2:识别尺寸改变事件自动设置最小宽度
void MainWindow::resizeEvent(QResizeEvent *e)
{
    int count = ui->tabWidget->tabBar()->count();
    int width = this->width() - 30;
    QString qss = QString("QTabBar::tab{min-width:%1px;}").arg(width / count);
    this->setStyleSheet(qss);
}

//方法3:设置全局样式,不同选项卡个数的设置不同的宽度
QStringList list;
list << QString("QTabWidget[tabCount=\"2\"]>QTabBar::tab{min-width:%1px;}").arg(100);
list << QString("QTabWidget[tabCount=\"3\"]>QTabBar::tab{min-width:%1px;}").arg(70);
qApp->setStyleSheet(list.join(""));
//设置了tabCount弱属性自动去找对应的宽度设置
ui->tabWidget->setProperty("tabCount", 2);
ui->tabWidget->setProperty("tabCount", 3);

//方法4:强烈推荐-》使用内置的方法 setExpanding setDocumentMode 两个属性都必须设置
ui->tabWidget->tabBar()->setDocumentMode(true);
ui->tabWidget->tabBar()->setExpanding(true);
//样式表一步到位不用每个都单独设置
QString("QTabBar{qproperty-usesScrollButtons:false;qproperty-documentMode:true;qproperty-expanding:true;}");
//在5.9以前开启这个设置后,貌似选项卡个数按照真实个数+1计算宽度,也就是永远会留空一个tab的占位。
//5.9以后貌似修复了这个BUG,按照理想中的拉伸填充等分设置tab的宽度。
```




Qt开发经验开源主页(持续更新):
1. [https://gitee.com/feiyangqingyun/qtkaifajingyan](https://gitee.com/feiyangqingyun/qtkaifajingyan)
2. [https://github.com/feiyangqingyun/qtkaifajingyan](https://github.com/feiyangqingyun/qtkaifajingyan)
8条评分好评度+2贡献值+2金钱+20威望+2
20091001753 好评度 +1 - 2021-06-17
20091001753 贡献值 +1 - 2021-06-17
20091001753 威望 +1 - 2021-06-17
20091001753 金钱 +10 - 2021-06-17
272064949 好评度 +1 优秀文章,支持! 2021-06-17
272064949 贡献值 +1 优秀文章,支持! 2021-06-17
272064949 威望 +1 优秀文章,支持! 2021-06-17
272064949 金钱 +10 优秀文章,支持! 2021-06-17
欢迎关注微信公众号:Qt实战/Qt入门和进阶(各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发) QQ:517216493  WX:feiyangqingyun  QQ群:751439350
离线lovecicada

只看该作者 1楼 发表于: 2021-06-27
离线九重水

只看该作者 2楼 发表于: 2021-06-27
有人经常不初始化一些东西,经常出现莫名其妙的现象。
我们的一个固件,我写了几千行初始化代码初始化整个机器。
有人一调用里面的函数,出现各种奇葩问题,
然后说,你写的代码不行,崩溃了。
然后我一看,尼玛,我写了几千行初始化代码,最后变成一个init函数,结果你倒好,就是不调用。合着我的初始化代码不用干活?
离线九重水

只看该作者 3楼 发表于: 2021-06-27
快速回复
限100 字节
 
上一个 下一个