zoukankan      html  css  js  c++  java
  • 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);
    }

    最后效果:

  • 相关阅读:
    git操作工作流
    http请求发生了两次(options请求)
    npm dose not support Node.js v10.15.3
    数据双向绑定页面无反应(angularjs)
    table样式的下拉框(angularjs)
    vue-router做路由拦截时陷入死循环
    js前台调用lodop打印
    vuejs2.0的生命周期解读
    Promise的一些相关讲解
    JAVA net 笔记
  • 原文地址:https://www.cnblogs.com/chechen/p/11960828.html
Copyright © 2011-2022 走看看