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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值