目录
1.初始化Mycombobox
1.往QComboBox中插入一个QLineEdit,通过QLineEdit的文本居中实现
//显示居中
QLineEdit*lineEdit = box->lineEdit();
if(lineEdit == 0)
{
lineEdit = new QLineEdit(box);
lineEdit->setFixedWidth(width);
lineEdit->setStyleSheet("background-color:transparent;border:none;");
lineEdit->setObjectName("lintEditAdptive");
lineEdit->setReadOnly(true);
lineEdit->setAlignment(Qt::AlignCenter);
lineEdit->setFocusPolicy(Qt::NoFocus);
QLineEdit::connect(lineEdit,&QLineEdit::selectionChanged,[=]{
lineEdit->deselect();
if(!lineEdit->isVisible())
box->showPopup();
});
QComboBox::connect(box,&QComboBox::currentTextChanged,[=](const QString &text){
for(int i = 0; i < box->count(); i++)
{
if(box->itemText(i) == text)
{
box->setCurrentIndex(i);
break;
}
}
});
box->setLineEdit(lineEdit);
}
2.下拉列表居中
//下拉列表居中
QStandardItemModel* model = static_cast<QStandardItemModel*>(box->view()->model());
if(model)
{
for(int i = 0; i < model->rowCount(); i ++)
{
if(model->item(i))
model->item(i)->setTextAlignment(Qt::AlignCenter);
}
}
3.加上默认样式设置完整代码
static void comboBoxInit(QComboBox*box,int width = 200,int height=30,bool bSheet=true)
{
//显示居中
QLineEdit*lineEdit = box->lineEdit();
if(lineEdit == 0)
{
lineEdit = new QLineEdit(box);
lineEdit->setFixedWidth(width);
lineEdit->setStyleSheet("background-color:transparent;border:none;");
lineEdit->setObjectName("lintEditAdptive");
lineEdit->setReadOnly(true);
lineEdit->setAlignment(Qt::AlignCenter);
lineEdit->setFocusPolicy(Qt::NoFocus);
QLineEdit::connect(lineEdit,&QLineEdit::selectionChanged,[=]{
lineEdit->deselect();
if(!lineEdit->isVisible())
box->showPopup();
});
QComboBox::connect(box,&QComboBox::currentTextChanged,[=](const QString &text){
for(int i = 0; i < box->count(); i++)
{
if(box->itemText(i) == text)
{
box->setCurrentIndex(i);
break;
}
}
});
box->setLineEdit(lineEdit);
}
if(bSheet)//是否设置样式
{
int font = 16;
int font_size = 19;
QString sheet = QString(
"QComboBox {border:1px solid #cbcbcb;padding: 1px 12px 1px 2px;color: black;padding-left:0px;font: normal normal %1px Microsoft YaHei;background-color: rgb(247,247,247);}"
"QComboBox::drop-down {width:%2px;height:%3px;image: url(:/new/prefix1/pic/down_blue.png);subcontrol-origin: content ;subcontrol-position: center right;}"
"QComboBox QAbstractItemView {outline: 0px solid gray;border: 1px solid #cbcbcb;selection-background-color: rgb(135,165,214);font: normal normal %4px 黑体;font-size: %1px;}"
"QComboBox QAbstractItemView::item {height:%5px;width:%6px;}"
"QComboBox QAbstractItemView::item:hover {color: white;background-color:rgb(135,165,214);}"
"QComboBox QAbstractItemView::item:selected {color: white;background-color: rgb(135,165,214);}")
.arg(font).arg(15).arg(15).arg(font_size).arg(height).arg(width);
box->setStyleSheet(sheet);
box->setView(new QListView());
box->view()->setCursor(Qt::PointingHandCursor);
}
//设置字体
QFont font = box->font();
for(auto w:box->findChildren<QWidget*>())
{
w->setFont(font);
}
//下拉列表居中
QStandardItemModel* model = static_cast<QStandardItemModel*>(box->view()->model());
if(model)
{
for(int i = 0; i < model->rowCount(); i ++)
{
if(model->item(i))
model->item(i)->setTextAlignment(Qt::AlignCenter);
}
}
};
2.安装事件管理器
static void comboBoxInstall(QComboBox* box,QObject*install){
if(box)
{
QLineEdit* lineEdit = box->lineEdit();
if(lineEdit)
{
box->installEventFilter(install);
lineEdit->installEventFilter(install);
box->setCursor(Qt::PointingHandCursor);
lineEdit->setCursor(Qt::PointingHandCursor);
}
}
};
3.事件管理器
static bool comboBoxEventFilter(QObject *target, QEvent *event){
static QComboBox* curComboBox = 0;//操作的下拉框
if(QString(target->metaObject()->className()) == "QComboBox")
{
QComboBox* box =qobject_cast<QComboBox*>(target);
if (box && event->type() == QEvent::FocusIn)
{
curComboBox = box;
}
else if (box && event->type() == QEvent::FocusOut)
{
curComboBox = nullptr;
}
}
else if(QString(target->metaObject()->className()) == "QLineEdit")
{
if (event->type() == QEvent::MouseButtonRelease)
{
QComboBox* box = qobject_cast<QComboBox*>(target->parent());
if(box && box == curComboBox)
{
if(box->isEnabled())
{
box->showPopup();
}
}
return true;
}
}
return false;
};
4.使用方法
默认设置了宽度和高度,需要修改的话直接设置即可
MyComboBox::comboBoxInit(ui->comboBox);
MyComboBox::comboBoxInstall(ui->comboBox,this);
重写 eventFilter
bool MainWindow::eventFilter(QObject *object, QEvent *event)
{
if(MyComboBox::comboBoxEventFilter(object,event))
{
return true;
}
return false;
}