一、简述

一般我们给QComboBox设置完字体之后,在显示上并没有什么问题如下图。

a、正常状态

由于程序在最大化的时候,因为主窗口尺寸变大,需要整体改变所有控件的尺寸,文字的大小,所以在窗口最大化时因为文字变大,所以会出现这样的效果。我们发现下拉列表没有铺满,虽然下拉框的的高度变了。

b、字体放大时,文字错位


所以在ComboBox创建完成,第一次展开下拉框时,下拉框文字显示是正常的,无论文字大小,下拉框都会自适应(见下图)。但是如果是下拉框已经出现过,后期需要再次修改ComboBox文字的大小时就会出现上图的问题。

c、下图为字体设置为20像素第一次显示时,然后点击按钮进行放大字体为30像素,再次显示文字错位

d、下图为字体设置为20像素,然后点击按钮进行放大字体为30像素,展开下拉框,文字显示正常,然后再次点击按钮进行缩小字体为20像素,再次展开下拉框时文字间距变大

所以这里我们看到,通过c、d两次操作的对比,我们了解到只要下拉框不显示,ComboBox文字怎么变化,在下拉框第一次展开的时候文字都会正常显示。


e 、如果没有给QComboBox设置样式,不管字体变化,下拉框是否展开过,文字都会正常显示


如果没有设置样式的情况下,改变字体大小都不会有影响,但是只要对QComboBox设置完样式就会出现上面的问题,哪怕是设置一个background:white;
一般情况下要想界面好看,肯定会对ComboBox设置样式,所以如果有遇到上面问题的小伙伴可以往下看如何解决。


f、上述代码

这里我们就直接简单点通过按钮控件放大,缩小来掩饰效果。

 TestComboBox::TestComboBox(QWidget *parent): QWidget(parent)
{   QComboBox* comboBox = new QComboBox(this);comboBox->setFixedSize(QSize(200, 24));comboBox->addItems(QStringList() << "ASFDSF" << "GFGDGF" << "FASFSFD" << "TGJHJGHO" << "硕大的撒多所" << "Qt学习");// 只设置背景白色也会出现上述问题(要么就不设置样式就不会有问题了,哈哈);
//    comboBox->setStyleSheet("QComboBox{background:white;}");comboBox->setStyleSheet("QComboBox{border-radius:3px;color:black;background:white;padding-left:5px;padding-right:12px;border:1px solid #b5b5b5;}\QComboBox:hover{border:1px solid gray;}\QComboBox::down-arrow{margin-right:10px;width:12px;height:8px;border-image:url(:/TestComboBox/Resources/ComboBoxDownArrow.png);}\QComboBox::down-arrow:on{width:12px;height:8px;border-image:url(:/TestComboBox/Resources/ComboBoxUpArrow.png);}\QComboBox::drop-down{background:transparent;}");QFont font;font.setPixelSize(20);comboBox->setFont(font);QPushButton* pButton = new QPushButton("Test");pButton->setFixedSize(QSize(50, 25));pButton->setCheckable(true);pButton->setStyleSheet("QPushButton{border-radius:5px;color:white;background:rgb(62, 149, 255);}\QPushButton:pressed{padding-left:3px;padding-top:3px;}");connect(pButton, &QPushButton::clicked, this, [=] {if (pButton->isChecked()){comboBox->setFixedSize(QSize(200, 36));QFont font;font.setPixelSize(30);comboBox->setFont(font);}else{comboBox->setFixedSize(QSize(200, 24));QFont font;font.setPixelSize(20);comboBox->setFont(font);}});QHBoxLayout* hMainLayout = new QHBoxLayout;hMainLayout->addWidget(comboBox);hMainLayout->addWidget(pButton); hMainLayout->addStretch();QVBoxLayout* vMainLayout = new QVBoxLayout(this);vMainLayout->addLayout(hMainLayout);vMainLayout->addStretch();
}

二、如何解决下拉框文字自适应问题

下面通过多次实践得到两种方法来解决ComboBox字体放大/缩小后下拉框文字显示的问题。

(1)、通过样式表的方式

对QComboBox重新设置样式。如果把设置样式的代码放在控件的放大缩小之前,则无效。必须在放大或者缩小之后再重新设置样式才能生效

connect(pButton, &QPushButton::clicked, this, [=] {if (pButton->isChecked()){comboBox->setFixedSize(QSize(200, 36));QFont font;font.setPixelSize(30);comboBox->setFont(font);}else{comboBox->setFixedSize(QSize(200, 24));QFont font;font.setPixelSize(20);comboBox->setFont(font);}comboBox->setStyleSheet("QComboBox{border-radius:3px;color:black;background:white;padding-left:5px;padding-right:12px;border:1px solid #b5b5b5;}\QComboBox:hover{border:1px solid gray;}\QComboBox::down-arrow{margin-right:10px;width:12px;height:8px;border-image:url(:/TestComboBox/Resources/ComboBoxDownArrow.png);}\QComboBox::down-arrow:on{width:12px;height:8px;border-image:url(:/TestComboBox/Resources/ComboBoxUpArrow.png);}\QComboBox::drop-down{background:transparent;}");});

(2)、通过setIconSize方法

comboBox->setIconSize(QSize(width, height));
调用setIconSize方法来让下拉框文字自适应高度。猜测setIconSize方法可以用来刷新下拉框item的高度。

connect(pButton, &QPushButton::clicked, this, [=] {if (pButton->isChecked()){comboBox->setFixedSize(QSize(200, 36));QFont font;font.setPixelSize(30);comboBox->setFont(font);comboBox->setIconSize(QSize(1, 36));}else{comboBox->setFixedSize(QSize(200, 24));QFont font;font.setPixelSize(20);comboBox->setFont(font);comboBox->setIconSize(QSize(1, 24));}});

这里的height并不决定下拉框每个item文字的高度,比如放大的时候改为comboBox->setIconSize(QSize(1, 50));效果还是一样,但是如果两个都设置成50,那就会出现这样的效果,在放大之后显示没有问题,再次缩小之后文字间距就变大了。


上面讲述了两种方法,第一种方法的时候要注意调用顺序,第二种方法的时候要注意height的值要设置为文字大致高度值。这两种方法的大致原理应该是通知ComboBox下拉框Item去刷新。目前是猜测,具体的看源码了解,有兴趣的小伙伴可以去了解一下。

正常效果图

三、拓展

以上两种方法让下拉框Item自适应,但是如果我们想要自定义Item的高度,还是要通过样式表去设置。
上面的问题也可以通过修改item高度来解决,但时会略显麻烦。

(1)、使用样式来设置Item高度

QComboBox QAbstractItemView::item{height:50px;}

效果图

我们看到并没有什么作用,高度仍然没有变化。
使用QComboBox QAbstractItemView::item来修改item的样式,前提必须调用comboBox->setView(new QListView()); 才会生效
我们看到虽然高度修改为50了,但是文字大小需要重新设置,此时comboBox->setFont(font);不会影响到下拉框的Item文字。

    comboBox->setView(new QListView());comboBox->setStyleSheet("QComboBox{border-radius:3px;color:black;background:white;padding-left:5px;padding-right:12px;border:1px solid #b5b5b5;}\QComboBox:hover{border:1px solid gray;}\QComboBox QAbstractItemView::item{height:30px;}\QComboBox::down-arrow{margin-right:10px;width:12px;height:8px;border-image:url(:/TestComboBox/Resources/ComboBoxDownArrow.png);}\QComboBox::down-arrow:on{width:12px;height:8px;border-image:url(:/TestComboBox/Resources/ComboBoxUpArrow.png);}\QComboBox::drop-down{background:transparent;}");

(2)、设置下拉框列表显示Item的最大个数

此方法用于显示QComboBox最大Item的个数。

setMaxCount(int max)

此方法用于显示QComboBox下拉框可显示的最大Item的个数。

setMaxVisibleItems(int maxItems)

 // 设置为最多3个item可见;comboBox->setMaxVisibleItems(3);


QComboBox下拉框文字如何在字体变大之后自适应高度相关推荐

  1. Qt QComboBox下拉框文字重叠解决方法

    Qt QComboBox下拉框文字重叠解决方法 参考文章: (1)Qt QComboBox下拉框文字重叠解决方法 (2)https://www.cnblogs.com/nanqiang/p/10559 ...

  2. QComboBox下拉框条目高度的调整

    今天在做活时,碰到如下问题:如果字体尺寸被加大,但是下拉框的条目的高度并没有自动调整,出现了重叠. 经过许久的查找,总结方法如下: 1.先在qss文件中定义 QComboBox QAbstractIt ...

  3. vue下拉框值改变_vue select下拉框绑定值不跟着变问题

    data() { return { value1: "", type: [{id: 1, name: '肖明'},{id: 2, name: '小红'},{id: 3, name: ...

  4. PyQt5 技术篇-QComboBox下拉框绑定监听事件实例演示

    currentIndexChanged.connect() 用于监听当前选择的索引改变. 即,选择的内容改变就会触发! items = ["脚本录制", "脚本回放&qu ...

  5. PyQt5 技术篇-设置QComboBox下拉框默认值,获取下拉框当前选择的内容

    setCurrentIndex() 就可以通过索引设置当前内容为items里的某个值,从0开始. 例:"2"就代表"脚本管理" currentText() 就可 ...

  6. QComboBox自定义(一)--类似QQ登陆界面的下拉框

    刚学Qt的时候,初步经历的第一个学习项目基本上都是LANQQ,初识时,不懂QSS,不懂布局,绘制界面最简单的方式成了使用designer拉满整个界面的控件,或者使用代码写了一些很蹩脚的布局.也是很羡慕 ...

  7. Qt实现复选下拉框 C++

    文章目录 一.QListWidget+QListWidgetItem 二.activate(int) 总结 一.QListWidget+QListWidgetItem 实现QComboBox下拉框复选 ...

  8. html下拉框只读,HTML元素(如select下拉框)设置为只读

    其实就是利用了鼠标事件和去焦点功能. 以select下拉框为例: οnmοuseοut="this.releaseCapture();"> value="optio ...

  9. autojs自定义下拉框

    牙叔教程 简单易懂 使用场景 自定义下拉框spinner 效果展示 git动图较大, 稍等片刻, 马上就好 autojs版本 8.8.12-0 萌新三连问 我要改背景 我要改字体颜色 我改了下拉框数据 ...

最新文章

  1. android实现长截屏,Android实现全屏截图或长截屏功能
  2. JSON.stringify() 格式化 输出log
  3. jsp界面自动生成文件注释_实施注释界面
  4. android动画文档,Android 动画系统汇总
  5. Servlet详细讲解
  6. app 常见网络性能
  7. scp连接linux网络错误,winscp连接linux(centos7)时提示主机超过15秒无通信,继续等待的解决方法...
  8. JAVA毕业设计华水疫情预警与防护用品调度系统计算机源码+lw文档+系统+调试部署+数据库
  9. 动态与静态二维码生成器
  10. 【DAOS】Intel DAOS 分布式异步对象存储|Architecture Overview|架构概述
  11. 亿格瑞A5-hdmi故障了
  12. hp batterie batterie charing port
  13. 各种机器学习分类模型的优缺点
  14. matlab 实现常用的混沌映射(Tent, Sine, Sinusoidal, Piecewise, Logistic, Cubic, Chebyshev)
  15. handlebars是什么
  16. MW6208U盘量产问题
  17. 2.2. Concepts
  18. 计算机二级vb选择题分值,计算机二级VB考试的考试分值和考试题型剖析及解题技巧...
  19. 虽败犹荣的McCain
  20. 集成XXL-JOB任务调度中心

热门文章

  1. 拼多多搜索商品详情分析接口代码对接教程
  2. 程序员怎么向上管理领导拿高绩效!
  3. 如何改变照片的大小kb?照片怎么改到100kb?
  4. JavaWeb - 黑马旅游网(6):旅游线路详情展示
  5. mysql 横向排列,mysql横向转纵向、纵向转横向排列
  6. 科学家发现「幼儿」星球 可能是颗小型棕矮星
  7. 《十四》微信小程序中的常用 API之登录、获取用户信息、支付、提现、跳转小程序、网络请求、弹框、导航、数据缓存、图片、查看文档、音频、拨打电话、剪贴板、滚动、WXML
  8. cmd解决端口被占用
  9. tcpdump抓包分段
  10. @Valid请求400错误解决