QT的combobox下拉列表的宽度默认情况下与combobox本身的宽度是一致的,但是有时候下拉列表的文字很长,显示不开的时候,就需要我们手动设置其宽度,
原理是遍历每一项的长度,找到最大长度,然后使用setFixedWidth函数设置combobox的显示宽度能够容纳这个最长的item即可。
用到一个知识点:百度搜索“字号尺寸大小对照表”,
假设item的字体我们设置为9号字,字体的单位为磅(point),而setFixedWidth(int)函数形参的单位是像素,
在windows设置为小字体模式时,1磅=4/3=1.333像素,也即,1像素=0.75磅
int max_len=0;
for(int idx=0;idx<ui->comboBox_portName->count();idx++)
{
if(max_len<ui->comboBox_portName->itemText(idx).length())
max_len = ui->comboBox_portName->itemText(idx).length();
}
ui->comboBox_portName->view()->setFixedWidth(max_len*9*0.75);//(字符数*每个字符的宽度(磅)*0.75)个像素
为了使上述程序具有通用性,可以继承Qcombobox为ComboboxEx,然后把添加的combobox提升为ComboboxEx,在添加完item之后,调用一下adjustItemWidth()函数即可把宽度调整好。
comboboxex.h的全文如下:
#ifndef COMBOBOXEX_H
#define COMBOBOXEX_H
#include<QComboBox>
class ComboBoxEx : public QComboBox
{
public:
ComboBoxEx();
ComboBoxEx(QWidget *parent = 0);
void adjustItemWidth();
};
#endif // COMBOBOXEX_H
comboboxex.cpp全文如下:
#include "comboboxex.h"
#include<QAbstractItemView>
ComboBoxEx::ComboBoxEx()
{
}
ComboBoxEx::ComboBoxEx(QWidget *parent):
QComboBox(parent)
{
}
void ComboBoxEx::adjustItemWidth()
{
int max_len=0;
for(int idx=0;idx < this->count();idx++)
{
if(max_len < this->itemText(idx).length())
max_len = this->itemText(idx).length();
}
int pt_val = this->font().pointSize();//获取字体的磅值
this->view()->setFixedWidth(max_len*pt_val*0.75);//(字符数*每个字符的宽度(磅)*0.75)个像素
}
使用效果如下图所示:
可以看到,新增加的com4内容较长,下拉列表的宽度也能容纳它
-------------后记--------------------
获取QString总的的像素宽度可以这样获得:
QString text = "Hello, World!";
QFont font("Arial", 12); // 设置字体和字号
QFontMetrics metrics(font); // 创建字体度量对象
int width = metrics.horizontalAdvance(text); // 获取字符串的宽度(像素)
int height = metrics.height(); // 获取字符串的高度(像素)
qDebug() << "Width: " << width;
qDebug() << "Height: " << height;cs().width(label.text());