将QComboBox下拉项中的文本居中、居右

QComboBox文字居中的几种实现方式 不知道你有没有遇到过这样的需求,将一个QComboBox的文字居中显示。我最近遇到了这样的需要,主要是要和其他的控件显示进行匹配,这也就要求我们必须将下拉列表的文字居中显示。这种需求可能实现的方式会有好多种,但我一直坚信,能用原生的就用原生的,或者在原生的控件之上进行一些特例化的改动,让其满足我们的需求是最简单的方式,并且不会过多的影响样式表设置。所以这儿我还是选择了QComboBox,而我们要做的事情就是怎样将他的文字居中显示。... 阅读详情
AI摘要

本文介绍如何使用Qt的model/view框架自定义QComboBox下拉项文本对齐方式,包括居中和居右,通过创建CComboBoxModel类并设置项文本对齐属性。

目录

1. 需求提出

2. 解决方法


1. 需求提出

    QComboBox下拉项中的文本默认是居左的,如下:

有时需要将下拉项中的文本居中、居右。如何实现?

2. 解决方法

        首先想到的是通过样式表来解决,但找遍Qt Assist和网络,都没这样的样式表,那就代码实现吧!本文用到了Qt的model/view framework框架,如果对Qt的“模型/视图/委托”框架不懂,本博文很难读懂。如果不懂这方面的知识,请在Qt Assistant 中输入Model/View Programming 学习了解。读者本机Qt安装目录下的Examples\Qt-XX.XX.XX\widgets\itemviews目录下有很多model/view framework的例子,可以进行自学了解,其中XX.XX.XX为Qt的版本号,如:5.14.1。代码如下:

comboBoxModel.h:

#ifndef COMBOBOXMODEL_H
#define COMBOBOXMODEL_H
#include <QAbstractItemModel>
class CComboBoxModel :
    public QAbstractItemModel
{
public:
    CComboBoxModel(QObject* parent = nullptr);

public:

    // 设置项的文本内容
    void addComboBoxContent(const QString& qsItemContent);

    // 设置项的文本内容
    void addComboBoxContent(const QStringList& lstItemContent);

    // 设置项文本对齐方式
    void setItemTextAlignMent(Qt::Alignment eAlignment);
public: // virtual

    virtual QModelIndex index(int row, int column, const QModelIndex& parent = QModelIndex()) const;

    virtual QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const;
private:

    virtual int columnCount(const QModelIndex& parent = QModelIndex()) const;
    
    virtual QModelIndex parent(const QModelIndex& index) const;

   virtual int rowCount(const QModelIndex & parent = QModelIndex()) const;

private:
    QStringList m_lstComboBoxContent;
    Qt::Alignment m_eAlignment{ Qt::AlignLeft}; // 项文本默认左对齐

};

#endif COMBOBOXMODEL_H

comboBoxModel.cpp:

#include "comboBoxModel.h"
CComboBoxModel::CComboBoxModel(QObject* parent /*= nullptr*/)
	:QAbstractItemModel(parent)
{

}

// 对于QComboBox只有1列
int CComboBoxModel::columnCount(const QModelIndex& parent /*= QModelIndex()*/) const
{
	return 1;
}

// 根据项的行列索引取得项在模型中的模型索引。注意:对于QComboBox只有1列
QModelIndex CComboBoxModel::index(int row, int column, const QModelIndex& parent/* = QModelIndex()*/) const
{
	return createIndex(row, column);
}

// 根据项的角色,取得该角色对应的属性
QVariant CComboBoxModel::data(const QModelIndex& index, int role /*= Qt::DisplayRole*/) const
{
	if (!index.isValid())
	{
		return QVariant();
	}
		
	if (Qt::TextAlignmentRole == role) // 项文本对齐属性
	{
		return QVariant(m_eAlignment);// Qt::AlignCenter;
	}
	else if(Qt::DisplayRole == role) // 项文本属性
	{
		auto rowIndex = index.row();
		return m_lstComboBoxContent[rowIndex];
	}

	return QVariant();
}

QModelIndex CComboBoxModel::parent(const QModelIndex& index) const
{
	return QModelIndex();
}

// 项个数
int CComboBoxModel::rowCount(const QModelIndex& parent/* = QModelIndex()*/) const
{
	return m_lstComboBoxContent.size();
}

// 设置项的文本内容
void CComboBoxModel::addComboBoxContent(const QString& qsItemContent)
{
	m_lstComboBoxContent.append(qsItemContent);
}

// 设置项的文本内容
void CComboBoxModel::addComboBoxContent(const QStringList& lstItemContent)
{
	m_lstComboBoxContent << lstItemContent;
}

void CComboBoxModel::setItemTextAlignMent(Qt::Alignment eAlignment)
{
	m_eAlignment = eAlignment;
}

QtWidgetsApplication1.cpp:

#include "QtWidgetsApplication1.h"
#include "comboBoxModel.h"
#include<QLineEdit>
QtWidgetsApplication1::QtWidgetsApplication1(QWidget *parent)
    : QWidget(parent)
{
    ui.setupUi(this);

    auto pModel = new CComboBoxModel(this);
    QStringList lst;
    lst << QStringLiteral("开机") << QStringLiteral("关机") << QStringLiteral("复位");
    pModel->addComboBoxContent(lst);
    auto eAlignment = Qt::AlignCenter;
    pModel->setItemTextAlignMent(eAlignment);

    ui.comboBox->setModel(pModel);

   
    auto pLineEdit = new QLineEdit;
    pLineEdit->setAlignment(eAlignment);
    pLineEdit->setReadOnly(true);
    ui.comboBox->setLineEdit(pLineEdit);
    m_qsLineEdit = lst[0];
    pLineEdit->setText(m_qsLineEdit);
    
    connect(ui.comboBox, QOverload<int>::of(&QComboBox::activated),
        [=](int index) { pLineEdit->setText(m_qsLineEdit); });

    connect(ui.comboBox, QOverload<int>::of(&QComboBox::currentIndexChanged),
        [=](int index)
        { 
            auto modelIndex = pModel->index(index, 0); // 获取选择的项的模型索引
            auto text = pModel->data(modelIndex).toString(); // 根据模型索引,从模型中取出项文本
            pLineEdit->setText(text); // 将项的文本设置到编辑框
            m_qsLineEdit = text;
        });
}

其中m_qsLineEdit为在QtWidgetsApplication1.h定义的、用来保存上次选择的文本。注意:一定要响应编辑框的activated信号,否则在下拉框中选择新的项时,编辑框将会清空上次的文本,这样很不友好,如下:

如下为项文本居中的最终效果:

可以通过CComboBoxModel类的setItemTextAlignMent函数来设置对齐方式。其它的代码注释很明白,就不再解释了。

QComboBox文字居中的实现办法 QComboBox的文字居中,下拉选项实现起来非常简单,但是本身的空间文本框默认是靠左的,想让他居中非常费劲,网上找到的一些方法都特别复杂,最后实现出来或多或少都有问题,没能完全满足我的需求。但最后终于找到一篇可以实现的了,虽然代码我也没太理解,但是效果不错。放到我本身的代码当中,外部对该对象进行样式表设置setStyleSheet,也是可以成功应用的,虽然和列表选项没有完全对准,但是是正常的啦。然后呢,他主要的实现方式是QComboBox控件重载paintevent,光是这一步就可以实现功能了。 阅读详情

相关推荐

关于QComboBox样式表设计及下拉列表文字居中的问题

QT编程中是不是会遇到下拉列表控件的样式比较难设计?或者效果难以实现?看这里!

timiki的博客 1160

C# winform 让ComboBox控件的文本居中方法

技术是好的与坏的,好人用技术是更好的,坏人用技术是更坏的。阅读好书,阅读大部分人未阅读过与课堂没有的书,阅读这片土地没有的知识就能增加一种思辨思维与智慧,才能走出狭隘思维偏见的洞穴!具体来说,它使用StringFormat类来设置文本的对齐方式,然后使用Graphics类的DrawString方法在指定的位置绘制文本。柏拉图在他的巨著《理想国》的第七卷里写到了洞穴理论阐明:一群从小被囚禁生活在洞穴里人,在洞穴外面的光线照明下,往内看是一片片黑影,往外看是光明的海阔天空,越看越明亮!

m0_58015531的博客 7776

告别拉伸丑界面!Qt Designer布局实战:用Spacer和水平/垂直布局搞定控件自适应

本文详细介绍了如何使用Qt Designer的Spacer和水平/垂直布局实现控件自适应,告别界面拉伸时的混乱问题。通过实战案例,展示了如何利用相对定位、弹性空间和嵌套组合等技巧,构建智能响应窗口尺寸变化的优雅界面。特别适合Qt开发者和界面设计师掌握自适应填充技术。

weixin_42524824的博客 206

QSS之QComboBox(文字居中)

QComboBox在Qt开发过程中经常使用,默认的下载列表风格达不到设计师的要求,本篇介绍基本的QComboBox的qss设置。

chenyijun的专栏 6507

【PyQt5】QComboBox文字居中

你永远也无法预料到,Qt到底埋了多少坑(我的是PyQt5),一个破文本居中都要搞那么麻烦一堆样式这里不生效那里不生效的真的是离谱。

weixin_44733774的博客 1628

NE564锁相环FM解调电路设计:10.7MHz中频实测与3种失真优化方案

本文详细解析了NE564锁相环在10.7MHz中频FM解调电路中的设计与优化方案。通过分析锁相环技术基础、电路架构设计及典型失真问题,提供了3种有效的失真优化方法,包括限幅增强、VCO频偏补偿和环路滤波优化,显著提升解调性能。文章还涵盖了PCB布局要点和系统测试验证,为高频电子线路设计提供实用参考。

weixin_33314040的博客 350

Qt QComboBox内容居中

1.往QComboBox中插入一个QLineEdit,通过QLineEdit的文本居中实现。默认设置了宽度和高度,需要修改的话直接设置即可。3.加上默认样式设置完整代码。重写 eventFilter。

weixin_64319089的博客 2663

博客系统 - 系统简介与首页设计

用Bootstrap实现手机端的博客导航栏效果。

m0_53450409的博客 1237

QT QCombobox中内容居中显示

【代码】QT QCombobox中内容居中显示。

qt,c++,java啥都学啥都不会本人 1720

工业组态软件Intouch(单机版)入门{第一篇}

通俗来讲Intouch就是一个能将PLC里的信号显示在画面上的软件。

weixin_41571357的博客 1万+

主流仿真软件Sigrity/HFSS/Siwave/Hyperlynx/ADS差异

在电子设计自动化(EDA)领域,各种仿真软件如Cadence Sigrity、Mentor Graphics的HyperLynx、Keysight的ADS以及ANSYS的SIwave等,都广泛应用于不同的应用场景中。综上所述,这些EDA仿真软件在各自的应用场景中发挥着重要作用,帮助工程师在设计阶段就能够评估和优化电子产品的性能,提高设计的可靠性和效率。:Sigrity由全球最大的EDA公司Cadence推出,Cadence还推出了Orcad和Allegro等著名软件。:由安捷伦(现是德科技)公司开发。

Geektec的专栏 9402

Qt设置QComBobox中文字居中

设置QComBobox的显示LineEdit文字居中 1.设置QComBobox状态为可编辑 ui->comboBox->setEditable(true); 2.设置LineEdit文字居中 ui->comboBox->lineEdit()->setAlignment(Qt::AlignCenter); 3.设置lineEdit为只读 ui->comboBox->lineEdit()->setReadOnly(true); 设置QComB

夕阳追脚尖的博客 1万+

基于 Simulink 的三相四线制整流器在三相不平衡负载下的中点电位平衡控制实战教程。

本文介绍了三相四线制整流器在不平衡负载下的中点电位平衡控制方法。首先分析了中点电位漂移的物理机理和控制策略(零序电压注入)。接着详细讲解了Simulink建模步骤:搭建三相四线制主电路、设计平衡控制算法、实现PWM调制。通过对比有无平衡控制的仿真结果,验证了控制方法的有效性。最后提供了工程建议:零序注入需限幅、考虑中性线寄生电感影响、采用稳健的PI参数。该方案能有效抑制中点电位波动,保障三电平系统在不平衡工况下的稳定运行。

MHD0815的博客 60

QComboBox文字居中的一种解决办法

QComboBox文字居中的一种解决办法 本文会尽可能解释一些内容,所以会显得有点长。 关于QComboBox文字的居中,网上提供的主流方案是,通过 QComboBox::setEditable 设置为可编辑状态,再获取 QComboBox::lineEdit 设置为只读并居中文字。 该方案的缺点在于改变了不可编辑状态下QComboBox的交互行为,例如,点击文本区域不会弹出列表,原因是QComboBox的一些交互行为依赖于 editable 属性,虽然可以通过自定义鼠标事件等方式完善,但不同平台上的交互

eiilpux17的博客 7122

SAP 系统中的数字签名解决方案及应用案例分析

在当前企业信息化及数字化转型的大背景下,数据安全与身份认证显得尤为重要。数字签名技术作为保障数据真实性和完整性的重要手段,在 SAP 系统中得到了广泛应用。本文将详细探讨 SAP 系统中部分应用场景如何利用数字签名技术满足业务需求,涵盖 SAP Single Sign-On、质量管理、过程工业生产计划以及 SAP ArchiveLink 内容服务器等方面,力求通过深入解读,帮助读者更好地理解和应用这一关键技术。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 527

【STM32项目】基于stm32智能鱼缸控制系统的设计与实现(完整工程资料源码)

随着现代化经济的快速发展,物质条件富足的人开始追求精神富足,越来越多的人通过饲养观赏鱼来充实生活、释放压力,但并非所有饲养者都有时间和经验来管理好鱼缸。一种由单片机控制,可实时检测和调节鱼缸环境,可把鱼缸环境实时反映给用户并能被用户远程操控的系统,可以解决养鱼成活率低、耗费时间和精力、参与感不强等诸多难题。

嵌入式技术开发 7351

Qt-QComboBox内容居中设置

Qt QComboBox内容居中Qt-QComboBox内容居中设置1. 显示内容居中2 .下拉菜单内容居中 Qt-QComboBox内容居中设置 1. 显示内容居中 QComboBox *comboBox = new QComboBox; QLineEdit *lineEdit = new QLineEdit; lineEdit->setReadOnly(true); lineEdit->setAlignment(Qt::AlignCenter); // 监听lineEdit事件

我的博客 5579

2026.3.10:最新claude code完美解决方案,跳过登录界面,使用国内deepseek-v4-pro进行计费

本文介绍了一种绕过Claude登录界面直接使用国内DeepSeek-V4-Pro服务的解决方案。通过npm全局安装@anthropic-ai/claude-code包,并配置5个关键环境变量:API认证令牌、基础URL(指向DeepSeek服务)、指定模型为deepseek-v4-pro、禁用非必要流量等。文中提供了4张配图辅助说明配置过程,但未展示具体内容。该方案可实现直接计费使用,无需通过官方登录流程。

拥抱具身智能,昇腾Ascend C 6500

C# ComboBox 文本居中设置

在原生的ComboBox功能中没有属性是设置文本位置,默认位置为左对齐;想要把其中的文本设置为居中但是没有直接方法; 方案一:网上流传比较多方法: 第一步:先将combobox的DrawMode属性设置为OwnerDrawFixed; 第二步:在comboBox的DrawItem事件方法中重新绘制item选项的位置;这里不做细说,附网址https://zhidao.baidu.com/q...

博客 1万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

关于QComboBox字体居中显示

可以这么用,加入一个QLineEdit QLineEdit*lineEdit=newQLineEdit; lineEdit->setReadOnly(true); lineEdit->setAlignment(Qt::AlignCenter); comboBox->setLineEdit(lineEdit); 由https://blog.youkuaiyun.com/qq_18286031/article/details/85113931处转载。 ...

w664355822的博客 2382

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Qt QComboBox 下拉列表文字居中显示

QComboBox *combox = new QComboBox;static_cast&lt;QStandardItemModel*&gt;(combox-&gt;view()-&gt;model())-&gt;item(positon)-&gt;setTextAlignment(Qt::AlignCenter);每次只能修改一个item的文字位置...

jiaojinlin的博客 1万+

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

QComboBox显示文本居中问题

项目场景: 项目中为了与其他控件显示的文本对齐,需要对QComboBox显示文本进行居中显示。网上找了一下并没有找到好的方法,记录一下这次解决方法 解决方案: 首先从网上找了一下,网上主流方法是通过setLineEdit(QLineEdit *edit)来设置edit的文本居中来完成文本居中显示,这样相当于改变了QComboBox显示框的属性了。但是这样点击edit框会无法弹出下拉框,又需要对edit框进行点击事件处理才可以完成。 我需要正常的label进行显示,尽量不改变它原有的属性,并且可以

wudipie的博客 3574

Qt QComboBox 居中下拉框,包括文字居中,下拉列表居中

详细代码如下: //下拉框风格初始化 void comboBoxInit(QComboBox*box,int widthScroll,int height,bool bClolor) { box->setStyle(QStyleFactory::create("windowsvista")); QLineEdit*lineEdit = box->lineEdit(); if(lineEdit == 0) { lineEdit = new QL.

hss2799的专栏 7202

QComboBox文本居中显示

摘要:本文介绍了在Qt中设置ComboBox控件文本居中的两种方法。重点推荐通过获取lineEdit对象的方式,在可编辑状态下设置文本居中,同时需要循环设置下拉菜单项的文本对齐方式。代码示例展示了如何实现编辑框和下拉列表选项的居中显示,包括设置只读属性、文本对齐等关键操作步骤。

Kelvin_Yan的专栏 249
上一篇: osgUtil::LineSegmentIntersector类源码分析(一)
下一篇: 空间直线与球面的相交算法
荆楚闲人
博客等级 码龄20年 3万+粉丝 473原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值