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

目录

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函数来设置对齐方式。其它的代码注释很明白,就不再解释了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/783734.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL存储与优化 一、MySQL架构原理

1.MySQL体系架构 MySQL Server架构自顶向下大致可以分网络连接层、服务层、存储引擎层和系统文件层 (1)网络连接层 客户端连接器&#xff08;Client Connectors&#xff09;&#xff1a;提供与MySQL服务器建立的支持。目前几乎支持所有主流的服务端编程技术&#xff0c;例如常…

EE trade:市价建仓的优缺点是什么

在金融市场的复杂环境中&#xff0c;市价建仓策略作为一种常见的交易手段&#xff0c;其优缺点成为了投资者关注的焦点。通过深入分析&#xff0c;我们可以更全面地理解这一策略的利弊&#xff0c;从而在实际操作中做出更加明智的决策。 市价建仓优点分析 快速执行 市价建仓…

鸿蒙系统:未来智能生态的引领者

在当今这个日新月异的互联网领域&#xff0c;操作系统作为连接硬件与软件的桥梁&#xff0c;其重要性不言而喻。随着华为鸿蒙系统&#xff08;HarmonyOS&#xff09;的崛起&#xff0c;一场关于操作系统未来的讨论再次被推向高潮。 鸿蒙OS&#xff0c;华为的全新力作&#xff…

从nginx返回404来看http1.0和http1.1的区别

序言 什么样的人可以称之为有智慧的人呢&#xff1f;如果下一个定义&#xff0c;你会如何来定义&#xff1f; 所谓智慧&#xff0c;就是能区分自己能改变的部分&#xff0c;自己无法改变的部分&#xff0c;努力去做自己能改变的&#xff0c;而不要天天想着那些无法改变的东西&a…

2024年电脑监控软件排行榜(真实测评推荐七款电脑监控软件)

在信息化快速发展的今天&#xff0c;企业对员工电脑活动的监控变得尤为重要。有效的电脑监控软件不仅可以提升员工的工作效率&#xff0c;还能防止信息泄露&#xff0c;保障企业的数据安全。本文将介绍几款知名的电脑监控软件&#xff0c;并对其特点进行详细分析&#xff0c;帮…

JavaWeb系列二十三: web 应用常用功能(文件上传下载)

文章目录 5. 文件上传基本介绍5.1 文件上传-原理示意图5.2 文件上传页面5.3 走通Servlet5.4 表单项区别处理5.5 创建目录-保存文件5.6 中文编码问题5.7 文件上传注意事项和细节5.7.1 按照年月日目录存放5.7.2 文件覆盖问题5.7.3 封装一下 5.8 文件上传其他注意事项5.8.1 upload…

浅谈信息技术高效课堂管理:策略、技巧与实践

引言&#xff1a; 在信息化教育的浪潮中&#xff0c;信息技术课程正逐渐成为学校教育体系中的重要组成部分。然而&#xff0c;信息技术课堂的特殊性——高互动性、高度依赖电子设备&#xff0c;给课堂管理带来了前所未有的挑战。如何在保证教学效率的同时&#xff0c;维护良好…

go mod 依赖管理补充2

依赖包的版本问题&#xff0c;别的开发语言有没有类似的问题&#xff1f;是怎么解决的&#xff1f; 举例&#xff1a;java java的依赖包的版本问题&#xff0c;通过Maven模块来操作&#xff0c;可以指定依赖包版本号&#xff0c;如下&#xff1a; go.mod 文件 go.mod文件是G…

VS2019运行显示缺少调试目标

出现问题点 如果点击运行显示上述错误&#xff0c;可以尝试先清理&#xff0c;然后重新生成 此时会出来一个调试目标路径&#xff0c;代表生成成功 但是运行还是显示缺少调试目标 右键项目&#xff0c;点击属性&#xff0c;然后修改路径&#xff0c;既可成功

谷粒商城学习笔记-19-快速开发-逆向生成所有微服务基本CRUD代码

文章目录 一&#xff0c;使用逆向工程步骤梳理1&#xff0c;修改逆向工程的application.yml配置2&#xff0c;修改逆向工程的generator.properties配置3&#xff0c;以Debug模式启动逆向工程4&#xff0c;使用逆向工程生成代码5&#xff0c;整合生成的代码到对应的模块中 二&am…

paddleocr运行报错?谈谈解决思路。

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

【网安播报】CocoaPods 曝关键漏洞,应用程序面临供应链攻击风险

1、CocoaPods 曝关键漏洞&#xff0c;数百万 macOS 和 iOS 应用程序面临供应链攻击风险 开源依赖管理器 CocoaPods 中的安全漏洞暴露了数千个软件包&#xff0c;利用这些漏洞的攻击者可以将恶意代码注入合法应用&#xff0c;通过受信任的渠道分发恶意软件&#xff0c;并破坏用户…

Python前沿技术:机器学习与人工智能

Python前沿技术&#xff1a;机器学习与人工智能 一、引言 随着科技的飞速发展&#xff0c;机器学习和人工智能&#xff08;AI&#xff09;已经成为了计算机科学领域的热门话题。Python作为一门易学易用且功能强大的编程语言&#xff0c;已经成为了这两个领域的首选语言之一。本…

私有化要约溢价60%,欧舒丹与投资者的相互成就

港股市场迎来新一轮私有化浪潮。据上海证券报不完全统计&#xff0c;自2023年以来&#xff0c;已有19家港股上市公司完成私有化退市。 对于深陷港股低估值困境的投资者来说&#xff0c;持仓名单里有公司宣布高溢价私有化要约&#xff0c;可谓“喜大普奔”的消息。 上市公司私…

A股周一低开低走,行情继续炸裂!

今天的A股&#xff0c;让人揪心不已、心情极度炸裂&#xff0c;你们知道是为什么吗&#xff1f;盘面上出现2个重要信号&#xff0c;一起来看看&#xff1a; 1、今天两市低开低走&#xff0c;A股又是绿油油的一天&#xff0c;两市近4800家个股在等待着上涨。近一个多月来&#…

快速掌握AI的最佳途径实践

科技时代&#xff0c;人工智能&#xff08;AI&#xff09;已经成为许多人希望掌握的重要技能。对于普通人来说&#xff0c;如何快速有效地学习AI仍然是一个挑战。本文将详细介绍几种快速掌握AI的途径&#xff0c;并提供具体的操作步骤和资源建议。 前言 AI的普及和应用已经深…

FL Studio 2024 发布,添加 FL Cloud 插件、AI 等功能

作为今年最受期待的音乐制作 DAW 更新之一&#xff0c;FL Studio 2024发布引入了新功能&#xff0c;同时采用了新的命名方式&#xff0c;从现在起将把发布年份纳入其名称中。DAW 的新增功能包括在 FL Cloud 中添加插件、AI 驱动的音乐创作工具和 FL Studio 的新效果。 FL Cloud…

国内知名源码交易平台及其特点,建议收藏!

​在数字化时代&#xff0c;源码交易平台成为连接开发者与项目需求的重要桥梁。这些平台不仅提供了丰富的源码资源&#xff0c;还促进了技术交流与合作。本文小编将分享介绍几个国内知名的源码交易平台&#xff0c;包括帮企商城、春哥技术博客、86资源网、春哥技术源码论坛以及…

年销量超1亿箱,三得利BOSS咖啡如何凭借人群战略打造极致产品力?

BOSS咖啡诞生于1992年&#xff0c;在可口可乐、朝日、麒麟等饮料巨头先后入局&#xff0c;市场竞争非常激烈的情况下&#xff0c;BOSS咖啡成为受国民欢迎的品牌&#xff0c;它是如何做到的呢? 罐装咖啡趋势崛起&#xff0c;各大品牌推出罐装咖啡 自1980年代起&#xff0c;罐装…

2024世界人工智能大会|实在智能孙林君分享实在Agent创新应用与落地进展

近日&#xff0c;2024世界人工智能大会&#xff08;WAIC 2024&#xff09;在上海举办&#xff0c;汇聚了9位图灵奖、菲尔兹奖、诺贝尔奖得主、88位国内外院士及超过1000位全球全球领军人物&#xff0c;共同探讨AI伦理治理、大模型、数据、算力等前沿议题&#xff0c;把握AI带来…