相关文章推荐
大气的稀饭  ·  Workflow | ...·  9 月前    · 
高大的大熊猫  ·  zabbix ...·  11 月前    · 
谦虚好学的紫菜  ·  [C#]MemoryStream.Dispo ...·  1 年前    · 

美化QComboBox

Qt还是很强大的,美化QComboBox只需要使用QSS就可以,如下:

QComboBox{ border:1px solid gray;  border-radius:3px;  padding: 5px; min-width:4em;}
QComboBox::drop-down{subcontrol-origin:padding; subcontrol-position:top right; width:20px; border-left-width:1px;border-left-color:darkgray; border-left-style:solid; border-top-right-radius:3px; border-bottom-right-radius:3px;}
QComboBox QAbstractItemView{border: 2px solid #4E6D8C;}
QComboBox::down-arrow{image: url(:/image/arrow-drop.png);}

按照上面的样式就可以美化QComboBox,效果图如下:
这里写图片描述

上面QComboBox含有去不掉的虚线,那么我们可以指定它的View/Model,然后指定List的委托:

    //设置委托、去除虚线框
    m_list->setItemDelegate(new NoFocusFrameDelegate(this));
    ui->chooseComboBox->setModel(m_list->model());
    ui->chooseComboBox->setView(m_list);

看看NoFocusFrameDelegate:

#ifndef NOFOCUSFRAMEDELEGATE_H
#define NOFOCUSFRAMEDELEGATE_H
#include <QStyledItemDelegate>
 * 去除虚线框
class NoFocusFrameDelegate : public QStyledItemDelegate
    Q_OBJECT
public:
    explicit NoFocusFrameDelegate(QWidget *parent = 0);
    void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;
signals:
public slots:
#endif // NOFOCUSFRAMEDELEGATE_H

NoFocusFrameDelegate.cpp:

#include "nofocusframedelegate.h"
#include <QPainter>
#include <QDebug>
NoFocusFrameDelegate::NoFocusFrameDelegate(QWidget *parent) :
    QStyledItemDelegate(parent)
void NoFocusFrameDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
    QStyleOptionViewItem itemOption(option);
    if( itemOption.state & QStyle::State_HasFocus)
        itemOption.state ^= QStyle::State_HasFocus;
    QStyledItemDelegate::paint(painter, itemOption, index);

原理就是不让ListWidget有QStyle::State_HasFocus这个状态,因为虚线是在这个状态下绘制出来的,就像hover状态绘制hover状态该有的东西。定义了List和Model,再接着美化List的Item项:

 QListView{border:1px solid gray}
 QListView::item{height:30px;}
 QListView::item{background:white;}
 QListView::item:hover{background: #BDD7FD;}

绘制显示文字

从上面看来已经好看很多了,但是下拉框选中了item之后QComboBox并不会显示选中了哪一项,所以我们得继承QComboBox并重写它的QComboBox::paintEvent()方法来重回文字,ComboBox.h:

#ifndef COMBOBOX_H
#define COMBOBOX_H
#include <QComboBox>
#include <QWidget>
class QListWidgetItem;
class ComboBox : public QComboBox
    Q_OBJECT
public:
    explicit ComboBox(QWidget *parent = 0);
    void paintEvent(QPaintEvent *e);
    void setCurrentItem(QString item);
signals:
public slots:
    //ListWidget的item项选择变换
    void currentItemChanged_slot(QListWidgetItem * current, QListWidgetItem * previous);
private :
    QString m_currentItem;
#endif // COMBOBOX_H

ComboBox.cpp:

#include "combobox.h"
#include <QPainter>
#include <QDebug>
#include <QListWidgetItem>
#include <QListWidget>
#include "comboboxitem.h"
ComboBox::ComboBox(QWidget *parent) :
    QComboBox(parent)
    m_currentItem = "文件夹";
void ComboBox::paintEvent(QPaintEvent *e)
//qDebug() << "I'm comboBox!";
    QComboBox::paintEvent(e);
    QPainter paint(this);
    paint.setRenderHint(QPainter::Antialiasing);
    //绘制文字
    paint.drawText(5, 23, m_currentItem);
void ComboBox::currentItemChanged_slot(QListWidgetItem *current, QListWidgetItem *previous)
    QListWidget *list = current->listWidget();
    ComboBoxItem * c = static_cast<ComboBoxItem *>(list->itemWidget(current));
    m_currentItem = c->getLabelString();
void ComboBox::setCurrentItem(QString item)
    m_currentItem = item;

在painter中绘制出来item项就可以了,,然后让自定的ComboBox连接ListWidget的currentItemChanged信号:

connect(m_list, SIGNAL(currentItemChanged(QListWidgetItem,QListWidgetItem)), ui->chooseComboBox,            SLOT(currentItemChanged_slot(QListWidgetItem,QListWidgetItem)));

在widget.ui里面使用自定义控件

border-color: rgb(22,63,23); background-color: rgb(5, 35, 55); selection-background-color:#484848; selection-color:#DCDCDC; QComboBox::down-arrow{ image: u..      组合框是一个重要且应用广泛的组件,一般由两个子组件组成:文本下拉单部分和按钮部分。在许多既需要用户选择、又需要用户手动输入的应用场景下,组合框能够很好的满足我们的需求。如我们经常使用的聊天软件QQ登录框,便是一个很好的应用例子:      显然,用户既可以自己手动输入新的QQ号码,也可以在列表框中选择历史输入记录。对于提高用户体验是一个不错的手段。这篇博文重点讲述如何用QS... border: 1px solid gray; /* 边框 */ border-radius: 3px; /* 圆角 */ padding: 1px 18px 1px 3px; /* 字体填衬 */ color: #000; font: normal normal 15px...
在这里记录工作中美化下拉框的qss代码,以便以后忘记,方便自己找到: QStyledItemDelegate* itemDelegate = new QStyledItemDelegate(); QComboBox *comboBox = new QComboBox(); comboBox->setItemDelegate(itemDelegate); comb...
下拉菜单四个角是圆角,但是背景不透明,给QComboBox包括他的QAbstractItemView设置了qss,不起作用,如下图所示。 而且这个QAbstractItemView的背景颜色是和上面的QComboBox设置的背景颜色一样的。 解决方案: ui->btn_combox_proxy_type->view()->parentWidget()->setWindowFlags(Qt::Popup | Qt::FramelessWindowHint); ui->btn
最近项目上使用到了透明背景的下拉控件,原本以为很简单,做的时候也没问题,但是只要一把windows系统设置的动画效果一打开,下拉框下拉的时候就会出现黑色拖影,很恶心,网上找了一圈,是真心没找到有解决这个问题的,难受啊,下面介绍一下一个在改动最小的情况下解决这个问题的方案,在继承QComboBox的基础上重载showPopup这个函数,下面是具体代码: void Combox::showPopup() QPoint point = this->mapToGlobal(QPoint...
PyQt是一个非常强大的Python模块,提供了许多GUI元素供开发者使用,QComboBox是其中一个非常常用的组件,下面详细解释一下QComboBox的用法。 QComboBox是一个可编辑的组合框控件,类似于下拉列表框,但不同的是,它可以用于输入和输出。QComboBox通常用于提供一组选项供用户选择,它可以自定义,为用户提供更友好的交互界面。 QComboBox的基本用法:首先在代码中引入该控件,如:from PyQt5.QtWidgets import QComboBox,然后在程序中新建QComboBox控件并设置其选项,如下: combo = QComboBox() combo.addItem("选项1") combo.addItem("选项2") combo.addItem("选项3") combo.addItem("选项4") combo.move(50, 50) combo.show() 在上面的代码中,我们定义了一个QComboBox对象,并使用addItem()方法添加了四个选项。move()和show()方法则表示将QComboBox对象放到屏幕上并显示出来。 除了上述基本用法,QComboBox还提供了其他几个常用的方法: 1. setCurrentIndex(i)方法:将当前选择项设置为指定索引i位置的选项。 2. currentIndexChanged信号:当用户改变选择项时会发射该信号并且传递新的索引值。 3. setEditable()方法:设置QComboBox是否可编辑。 4. setIconSize()方法:设置下拉列表中图标的大小。 除此之外,QComboBox还支持很多其他属性和方法,可以根据不同的需求进行自定义设置和调用。总的来说,QComboBox是一个非常实用的控件,可以大大提高Python程序的交互性和用户体验。