赞助

Qt 组合框QComboBox的定制

转载:https://www.cnblogs.com/csuftzzk/p/qss_combobox.html

转载:https://www.bbsmax.com/A/E35pLgRK5v/

转载:https://www.cnblogs.com/peterliang/p/3618820.html(QSplitter 拆分窗口)

转载:http://blog.sina.com.cn/s/blog_a6fb6cc90101i8it.html

Demo参考网上的例子,暂时记录下来,随后再整理

1.自定义combobox中的item控件

#include <QWidget>
#include <QLabel>

class ComboboxItem : public QWidget
{
    Q_OBJECT

public:
    ComboboxItem(QWidget *parent);
    ~ComboboxItem();

    void setLabelContent(const QString & str);

signals:
    void chooseAccount(const QString&);

private:
    QLabel* m_img;
    QLabel* m_label;
};

 

#include "ComboboxItem.h"
#include <QHBoxLayout>

ComboboxItem::ComboboxItem(QWidget *parent)
    : QWidget(parent)
{
    m_img = new QLabel(this);
    m_label = new QLabel(this);
    m_img->setStyleSheet("QLabel{background: rgb(255, 0, 0)}");
    m_img->setFixedSize(15, 20);

    QHBoxLayout* layout = new QHBoxLayout(this);

    layout->addWidget(m_img);
    layout->addWidget(m_label);
    layout->setContentsMargins(5, 5, 5, 5);

    setLayout(layout);
}

ComboboxItem::~ComboboxItem()
{
}

void ComboboxItem::setLabelContent(const QString & str)
{
    m_label->setText(str);
}

2.自定义代理

#include <QStyledItemDelegate>

class NoFocusFrameDelegate :public QStyledItemDelegate
{
    Q_OBJECT
public:
    NoFocusFrameDelegate(QObject* parent = 0);
    ~NoFocusFrameDelegate();


    virtual void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;
};
#include "NoFocusFrameDelegate.h"

NoFocusFrameDelegate::NoFocusFrameDelegate(QObject* parent /*= 0*/)
{

}

NoFocusFrameDelegate::~NoFocusFrameDelegate()
{

}

void NoFocusFrameDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    QStyleOptionViewItem  view_option(option);
    if (view_option.state & QStyle::State_HasFocus) {
        view_option.state = view_option.state ^ QStyle::State_HasFocus;
    }

    QStyledItemDelegate::paint(painter, view_option, index);
}

 

3.主窗口中使用

#include <QtWidgets/QMainWindow>
#include "ui_QMyCombobox.h"

class QListWidget;

class QMyCombobox : public QMainWindow
{
    Q_OBJECT

public:
    QMyCombobox(QWidget *parent = Q_NULLPTR);

public slots:

   void onChooseAccount(const QString& str);



private:
    Ui::QMyComboboxClass ui;

    QListWidget* m_listWidget;
};
#include "QMyCombobox.h"
#include <QListWidget>
#include "NoFocusFrameDelegate.h"
#include "ComboboxItem.h"

QMyCombobox::QMyCombobox(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);

    m_listWidget = new QListWidget(this);

    // 设置子项目代理,否则下拉框选项周围会出现虚线框
    m_listWidget->setItemDelegate(new NoFocusFrameDelegate(this));
    ui.comboBox->setEditable(true);
    ui.comboBox->setModel(m_listWidget->model());
    ui.comboBox->setView(m_listWidget);

    // 在下拉框中添加5个选项
    for (int i = 0; i < 5; ++i)
    {
        ComboboxItem* item = new ComboboxItem(this);
        item->setLabelContent(QString("Account") + QString::number(i, 10));
        connect(item, SIGNAL(chooseAccount(const QString&)), this, SLOT(onChooseAccount(const QString&)));
        QListWidgetItem* widgetItem = new QListWidgetItem(m_listWidget);
        m_listWidget->setItemWidget(widgetItem, item);
    }
}

void QMyCombobox::onChooseAccount(const QString& str)
{
    ui.comboBox->setCurrentText(str);
}

 

最后效果:

posted @ 2019-11-29 22:54  车臣  阅读(2260)  评论(1编辑  收藏  举报