Qt/C++开发经验小技巧301-305

text":"从Qt5.2版本开始 , QLineEdit文本框控件提供了setClearButtonEnabled函数用于是否开启右侧的关闭按钮 , 这种控件非常常见 , 比如还可以增加个搜索按钮 , 怎么添加呢 , 在5.2版本以前要自己定义一个布局 , 然后new一个按钮放在布局右侧 。 在5.2版本以后 , 提供了addAction重载方法 , 用于添加一个动作到文本框的前面或者后面 , 这种方式会自动留出边距 。#if (QT_VERSION < QT_VERSION_CHECK(520))//所有Qt版本都兼容的万能办法QPushButton *searchButton = new QPushButton;//执行对应的处理connect(searchButton SIGNAL(clicked(bool)) this SLOT(search()));searchButton->setMinimumWidth(30);searchButton->setIcon(QIcon(\":/main.ico\"));//实例化布局用于放置按钮QHBoxLayout *layout = new QHBoxLayout(ui->lineEdit);layout->setContentsMargins(0 0 1 0);//指定对齐方式添加按钮layout->addWidget(searchButton 0 Qt::AlignRight);//设置文本的外边距/空出距离放置按钮ui->lineEdit->setTextMargins(0 0 searchButton->minimumWidth() + 3 0);#else//推荐用下面这个方法更方便QAction *searchAction = new QAction(ui->lineEdit);//执行对应的处理connect(searchAction SIGNAL(triggered(bool)) this SLOT(search()));searchAction->setIcon(QIcon(\":/main.ico\"));//TrailingPosition表示右侧/还可以是LeadingPosition表示左侧ui->lineEdit->addAction(searchAction QLineEdit::TrailingPosition);#endif大概从6.5版本开始 , mingw编译的debug套件编译大名鼎鼎的qcustomplot开源图表控件 , 会提示报错too many sections/file too big字样 。 release套件或者其他编译器都正常 。 你只需要在pro中加上 QMAKE_CXXFLAGS += -Wa-mbig-obj 即可 。 大概从2024年开始 , 在线安装Qt的工具默认不加载Qt5的安装包 , 需要在右上角有个什么 Archive 的 , 勾选一下 , 然后单击 Filter/筛选 按钮即可 , 这样左侧就会将Qt5的也都显示出来 。 估计官网是想强制让我们用Qt6 , 慢慢的把Qt5淘汰 。 可惜的是Qt6不支持win7 , 而win7目前用户数还是很多的 。 使用Qt的drawText绘制文本 , 如果使用的对应参数是QPoint坐标的函数 , drawText(const QPoint &p const QString &s) , 务必注意他是以左下角作为起始点的(Qt文档中特意写了 The y-position is used as the baseline of the font) , 这个和其他开发框架比如C#等都不同 , 理论上按照屏幕绘制规则 , 应该是左上角才对 , 所以涉及到和其他平台对接的时候 , 建议采用 void drawText(const QRect &r const QString &text) 函数绘制 , 指定一个区域 。 这个知识点很容易被忽视 , 从而造成灾难性的后果 。 在linux上使用webengine浏览器模块打开网页时 , 有些系统可能出现崩溃的现象 , 就算是直接编译运行自带的浏览器示例比如simplebrowser , 也是无法正常打开网页 。 原因是为了安全性考虑 , 沙箱运行啥的 , 需要设置个环境变量 。 只需要在main函数最前面加一行 qputenv(\"QTWEBENGINE_DISABLE_SANDBOX\" \"1\") 即可 。 在QListWidgetItem设置复选框后 , 有时候希望在切换复选框的时候有个信号通知 , 以便进行处理 , 到这里你会发现 , QListWidget所有信号中并没有该信号 , 通过查阅QListWidgetItem的setCheckState函数源码得知 , 会发送一个dataChanged信号 , 该信号是QListWidget的数据模型发出来的 , 于是就很好办了 。void Form::on_listWidget_itemPressed(QListWidgetItem *item){//鼠标按下切换选中状态item->setCheckState(item->checkState() == Qt::Checked ? Qt::Unchecked : Qt::Checked);void Form::dataChanged(const QModelIndex &topLeft const QModelIndex &bottomRight){\t//为什么需要通过文本再去找到节点/而不是取选中的节点/因为不选中也可以勾选前面的复选框QListWidgetItem *item;QString text = topLeft.data().toString();int count = ui->listWidget->count();for (int i = 0; i < count; ++i) {item = ui->listWidget->item(i);if (item->text() == text) {break;//找到对应节点后进行处理国内站点:https://gitee.com/feiyangqingyun 国际站点:https://github.com/feiyangqingyun"

    推荐阅读