当前位置: 首页 > news >正文

Qt开发技巧(十四)文字的分散对齐,设置动态库路径,进度条控件的文本,文件对话框的卡顿,滑块控件的进度颜色,停靠窗体的排列,拖拽事件的坑

继续讲一些Qt开发中的技巧操作:
1.文字的分散对齐
有时候需要对文本进行分散对齐显示,相当于无论文字多少,尽可能占满整个空间平摊占位宽度,但是在对支持对齐方式的控件比如QLabel调用 setAlignment(Qt::AlignJustify | Qt::AlignVCenter)设置分散对齐会发现没有任何效果,这个时候就要考虑另外的方式比如通过控制字体的间距来实现分散对齐效果。

QString text = "测试分散对齐内容";
//计算当前文本在当前字体下占用的宽度
QFont font = ui->label->font();
int textWidth = ui->label->fontMetrics().width(text);
//显示文本的区域宽度=标签的宽度-两边的边距
int width = ui->label->width() - 12;
//需要-1相当于中间有几个间隔
int count = text.count() - 1;
//计算每个间距多少
qreal space = qreal(width - textWidth) / count;
//设置固定间距
font.setLetterSpacing(QFont::AbsoluteSpacing, space);
ui->label->setFont(font);
ui->label->setText(text);

2.设置动态库路径
Qt提供的设置动态库路径的方法setLibraryPaths是用来搜索插件动态库的,而不是程序直接依赖的动态库;很多人以为这个可以设置Qt的库或者程序中依赖的第三方库的路径,其实想想也知道,因为程序依赖这个库,找不到的话根本跑不起来,程序跑不起来怎么应用执行这个代码呢;Qt默认是可用通过setLibraryPaths的方式设置Qt插件的动态库目录位置,比如数据库插件sqldrivers,软键盘的插件库等等,因为这些库文件是真正在Qt程序跑起来以后通过插件形式去加载的;还可以通过qt.conf文件设置 Plugins=“config” 指定所有插件在可执行文件下的config目录下;要想设置程序直接依赖的动态库在其他目录,找遍所有也只有一个办法,那就是设置环境变量,除此别无他法。至于如何设置环境变量方式很多,比如手动在电脑上设置,或者搞个批处理文件执行命令行,在程序安装的时候自动执行,或者程序打包目录下用户手动运行这个批处理。最终找插件的路径其实就是这个 QT_PLUGIN_PATH 环境变量;设置插件的目录还可以通过在main函数最前面这样写来实现。


int main(int argc, char *argv[])
{//启动键盘,Qt默认键盘qputenv("QT_IM_MODULE", QByteArray("qtvirtualkeyboard"));QApplication a(argc, argv);MainWindow w;w.show();return a.exec();
}

3.进度条控件的文本
进度条控件如果设置的垂直方向,就算你设置了文本可见,会发现根本看不到进度文本,经过多方百折不挠的试探,以及查看其他大佬的文章,发现只要设置下border样式(border:1px solid #ff0000、border:none、border-style:solid、border-radius:0px 任意一种)就行,就可以把文本显示出来;
4.文件对话框的卡顿
我们在使用QFileDialog::getOpenFileName、QFileDialog::getExistingDirectory等方法时,有时候会发现首次打开很卡,尤其是在默认目录很多文件的时候,此时你可以考虑设置这些函数最末尾的参数为QFileDialog::DontUseNativeDialog,表示不采用本地系统对话框,这样的话会采用Qt的对话框,速度快很多,估计系统的对话框在打开的时候会做很多初始化加载处理;

QFileDialog::getOpenFileName(this, "", "", "", 0, QFileDialog::DontUseNativeDialog);
QFileDialog::getExistingDirectory(this, "", "", QFileDialog::DontUseNativeDialog);

5.滑块控件的进度颜色
滑块控件QSlider,如果设置的垂直样式,其进度颜色和剩余颜色,刚好和横向样式的颜色相反的,不确定这个是否是Qt的BUG,Qt各版本都存在这个现象

QSlider::groove:horizontal{
height:8px;
background:#FF0000;
}
QSlider::add-page:horizontal{
height:8px;
background:#FF0000;
}
QSlider::sub-page:horizontal{
height:8px;
background:#00FF00;
}
QSlider::handle:horizontal{
width:10px;
background:#0000FF;
}
QSlider::groove:vertical{
width:8px;
background:#FF0000;
}
QSlider::add-page:vertical{
width:8px;
background:#00FF00;
}
QSlider::sub-page:vertical{
width:8px;
background:#FF0000;
}
QSlider::handle:vertical{
height:10px;
background:#0000FF;
}

6.停靠窗体的排列
QMainWindow 在对停靠窗体进行排列的时候,有些不常用的设置容易遗忘,建议将QMainWindow 的头文件函数过一遍一目了然;

//设置允许各种嵌套比如上下排列左右排列非常灵活
//此设置会和下面的 setDockOptions 中的参数覆盖所以要注意顺序
//this->setDockNestingEnabled(true);
//设置停靠参数,不允许重叠,只允许拖动和嵌套
this->setDockOptions(AnimatedDocks | AllowNestedDocks);
//将底部左侧作为左侧区域,底部右侧作为右侧区域,否则底部区域会填充拉伸
this->setCorner(Qt::BottomLeftCorner, Qt::LeftDockWidgetArea);
this->setCorner(Qt::BottomRightCorner, Qt::RightDockWidgetArea);

在这里插入图片描述
7.拖拽事件的坑
很多人以为拖曳只要在dropEvent事件就可以了,其实不行的,没有效果的,需要先在
dragEnterEvent事件中执行event->accept()才行,不然根本没有效果,很多人尤其是初学者都挂在这里,我在这里也掉过坑。

void frmMain::dropEvent(QDropEvent *event)
{QList<QUrl> urls = event->mimeData()->urls();
}
void frmMain::dragEnterEvent(QDragEnterEvent *event)
{if(event->mimeData()->hasFormat("application/xqabstractitemmodeldatalist")) {event->setDropAction(Qt::MoveAction);event->accept();} else {event->ignore();}
}
http://www.lryc.cn/news/454546.html

相关文章:

  • VirtulBOX Ubuntu22安装dpdk23.11
  • 线性代数书中求解齐次线性方程组、非齐次线性方程组方法的特点和缺陷(附实例讲解)
  • 初识算法 · 双指针(2)
  • React常见面试题目
  • 图解网络OSI模型与TCP/IP
  • 15分钟学 Python 第31天 :Web Scraping
  • 前端编程艺术(2)----CSS
  • 前端的全栈混合之路Meteor篇(二):RPC方法注册及调用
  • 重学SpringBoot3-集成Redis(三)之注解缓存策略设置
  • 【C++11】新特性
  • 【游戏模组】重返德军总部2009高清重置MOD,建模和材质全部重置,并且支持光追效果,游戏画质大提升
  • CGLib动态代理和JDK动态代理Demo、ASM技术尝鲜
  • [C++]使用纯opencv部署yolov11-pose姿态估计onnx模型
  • python you-get下载视频
  • SCUC博客摘录「 储能参与电能市场联合出清:SCUC和SCED模型应用于辅助服务调频市场(IEEE39节点系统)」2024年10月6日
  • Git分支-团队协作以及GitHub操作
  • 力扣刷题 | 两数之和
  • [C#]winform部署官方yolov11-obb旋转框检测的onnx模型
  • 【GC日志和OOM日志分析】JVM GC日志和OOM Dump文件分析
  • 【电路】1.1 实际电路和电路模型
  • Vue - 打包部署
  • spring揭秘25-springmvc03-其他组件(文件上传+拦截器+处理器适配器+异常统一处理)
  • springboot项目中属性的使用优先级;maven编译插件切换环境变量
  • 【Qt】控件概述 (1)—— Widget属性
  • (笔记)第三期书生·浦语大模型实战营(十一卷王场)–书生基础岛第3关---浦语提示词工程实践
  • OpenCV视频I/O(11)视频采集类VideoCapture之设置视频捕获设备的属性函数 set()的使用
  • 数据结构之树(3)
  • 螺蛳壳里做道场:老破机搭建的私人数据中心---Centos下docker学习02(yum源切换及docker安装配置)
  • 强化学习笔记之【Q-learning算法和DQN算法】
  • 面试经验02