使用场景
工作中,有时需要将QCombox做一些处理,比如此篇的隐藏其下拉箭头,将文本右对齐,展现的效果如QLabel的效果一样,但是却拥有其QCombox的信号。也有一种可能就是之前原有的程序设计为QCombox且可以下拉点击,但是由于需求变更,不再需要下拉框,下拉箭头,这时又要其文本保持右对齐。
显示效果如下:
下面是实现QCombox隐藏下拉箭头其文本居右显示;
实现代码
void setComboxEquivalentLineEdit(QComboBox *pCombox)
{
pCombox->setStyleSheet(
"QComboBox{border:1px red solid;}QComboBox::drop-down "
"{width:0px;border:1px red solid;}"//设置下拉箭头所在的框不显示,即:即使不显示下拉箭头,也不占用右侧空间
"QComboBox::down-arrow{image:none;}");//设置不显示下拉箭头
pCombox->setLineEdit(new QLineEdit);//需要添加行编辑器,否则无法设置对齐方式
pCombox->lineEdit()->setAlignment(Qt::AlignRight);
pCombox->lineEdit()->setStyleSheet("background:transparent;border:0px;");
}
额外补充
下面是设置QCombox中的文本向右对齐的函数(但是是对于不隐藏QCombox的下拉箭头的常规控件)。可根据QCombox中的文本宽度及图标宽度,自动调整文本,使其向右对齐。
void setComboBoxToRightAlign(QComboBox *pCmb)
{
if (!pCmb)
{
return;
}
QFont font = pCmb->font();
QFontMetrics metr(font);
int currentTextWidth = metr.width(pCmb->currentText());
int pIConWidth = pCmb->iconSize().width();
int nWidth = currentTextWidth + pIConWidth + 3;
int nLeft = pCmb->rect().width() - nWidth;
nLeft = nLeft < 0 ? 0 : nLeft;
QString sStyleOld = pCmb->styleSheet();
QString sStyle = QString("QComboBox{ padding-left:%1px;}").arg(nLeft);
sStyleOld = sStyleOld + sStyle;
pCmb->setStyleSheet(sStyleOld);
pCmb->update();
}
完整代码
下面是完整的代码实现。
开发环境
关于我的qt版本如下:
使用的编译器MSVC2017 64bit:
项目创建类型
创建基于QT的应用程序。
项目结构
实现代码:
main.cpp
#include "dialog.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Dialog w;
w.show();
return a.exec();
}
dialog.h
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
#include <QComboBox>
QT_BEGIN_NAMESPACE
namespace Ui {
class Dialog; }
QT_END_NAMESPACE
class Dialog : public QDialog
{
Q_OBJECT
public:
Dialog(QWidget *parent = nullptr);
~Dialog();
private:
void comboxAddTextItem();
void setComboxRightAlignmentHideArrow();
void setComboBoxToRightAlign(QComboBox *pCmb);
private:
Ui::Dialog *ui;
};
#endif // DIALOG_H
dialog.cpp
扫描二维码关注公众号,回复:
15227097 查看本文章
#include "dialog.h"
#include "ui_dialog.h"
#include <QLineEdit>
Dialog::Dialog(QWidget *parent)
: QDialog(parent)
, ui(new Ui::Dialog)
{
ui->setupUi(this);
comboxAddTextItem();
//以下两行代码可选其中一行放开注释,查看效果
// setComboxRightAlignmentHideArrow();
// setComboBoxToRightAlign(ui->comboBox);
}
Dialog::~Dialog()
{
delete ui;
}
void Dialog::comboxAddTextItem()
{
QStringList strList;
strList<<"dfhu"<<"dfgdfg"<<"assw";
ui->comboBox->addItems(strList);
ui->comboBox->setCurrentText("dfhu");
}
void Dialog::setComboxRightAlignmentHideArrow()
{
ui->comboBox->setStyleSheet("QComboBox{border:1px red solid;}QComboBox::drop-down {width:0px;border:1px red solid;}");
ui->comboBox->setLineEdit(new QLineEdit);
ui->comboBox->lineEdit()->setAlignment(Qt::AlignRight);
}
void Dialog::setComboBoxToRightAlign(QComboBox *pCmb)
{
if (!pCmb)
{
return;
}
QFont font = pCmb->font();
QFontMetrics metr(font);
int currentTextWidth = metr.width(pCmb->currentText());
int pIConWidth = pCmb->iconSize().width();
int nWidth = currentTextWidth + pIConWidth + 3;
int nLeft = pCmb->rect().width() - nWidth;
nLeft = nLeft < 0 ? 0 : nLeft;
QString sStyleOld = pCmb->styleSheet();
QString sStyle = QString("QComboBox{ padding-left:%1px;}").arg(nLeft);
sStyleOld = sStyleOld + sStyle;
pCmb->setStyleSheet(sStyleOld);
pCmb->update();
}
运行效果
效果一
注释掉setComboBoxToRightAlign(ui->comboBox);这行,另一行放开:
运行效果:
效果二
注释掉setComboxRightAlignmentHideArrow();这行,另一行放开;
运行效果: