zoukankan      html  css  js  c++  java
  • QT定制有标题的扁平化下拉框控件

    关键字:QT,QComboBox,QLineEdit,QListView,QPushButton,QMenu,QWidgetAction,setStyleSheet

    OS:Windows 7

    方法一:QComboBox+QLineEdit+QListView

    相关问题链接:QComboBox: Can we make the entire combobox clickable, not just the dropdown button (arrow) itself?

    为了使整个combobox都是可点击的,所以加个QTComboBoxButton类继承QLineEdit,在mousePressEvent里面showPopup。

    class QTComboBoxButton : public QLineEdit
    {
        Q_OBJECT
    public:
        QTComboBoxButton(QWidget *parent = 0);
        ~QTComboBoxButton();
    
    protected:
        void mousePressEvent(QMouseEvent *);
    };
    
    QTComboBoxButton::QTComboBoxButton(QWidget *parent /* = 0 */) :
        QLineEdit(parent)
    {
    }
    
    QTComboBoxButton::~QTComboBoxButton()
    {
    }
    
    void QTComboBoxButton::mousePressEvent(QMouseEvent * e)
    {
        QComboBox* combo = dynamic_cast<QComboBox*>(parent());
        if(combo)
            combo->showPopup();
    }

    QComboBox+QLineEdit+QListView的使用如下:

    QComboBox* myCombo = new QComboBox;
        myCombo->setView(new QListView());
        myCombo->setEditable(true);
        myCombo->setLineEdit(new QTComboBoxButton(m_pAnswer));
        myCombo->lineEdit()->setReadOnly(true);
        myCombo->addItem("Option1");
        myCombo->addItem("Option2");
        myCombo->addItem("Option3");
        myCombo->setMaxVisibleItems(myCombo->count());
        myCombo->lineEdit()->setText("Please select");
        QString arrowImagePath = "c:arrow.png";
        myCombo->setStyleSheet("QComboBox {font-family: "Arial"; font-size: 13px; padding: 3px 0x 3px 5px;}"
            "QComboBox::drop-down {subcontrol-origin: padding; subcontrol-position: top right;  30 px; border: 0px;}"
            "QComboBox::down-arrow {image: url("+ arrowImagePath +");}");
        myCombo->view()->setStyleSheet("QListView {font-family: "Arial"; font-size: 13px; outline: 0px;}"
            "QListView::item {padding: 3px 0x 3px 5px; border- 0px;}"
            "QListView::item:selected {background-color: rgb(74, 144, 226);}");

    UI效果如下图:

    方法二:QPushButton+QMenu+QWidgetAction

    相关问题链接:QMenu: How to customize the menu items of QMenu

    定制类QTDropDownButton 

    class QTDropDownButton : public QPushButton
    {
        Q_OBJECT
    public:
        QTDropDownButton(QString text, QWidget *parent = nullptr);
    
        void addItem(QString text);
    
    protected slots:
        void menuAboutToShow();
        void menuTriggered(QAction *action);
    
    private:
        QMenu* menu_;
    };
    
    QTDropDownButton::QTDropDownButton(QString text, QWidget *parent) :
        QPushButton(text, parent)
    {
        setFlat(true);
        menu_ = new QMenu();
        setMenu(menu_);
    
        connect(menu_, SIGNAL(aboutToShow()), this, SLOT(menuAboutToShow()));
        connect(menu_, SIGNAL(triggered(QAction*)), this, SLOT(menuTriggered(QAction*)));
    
        setStyleSheet("QPushButton {text-align: left; font-family: Arial; font-size: 13pt; color: #808080; border: 1px solid gray; padding: 5px;}"
            "QPushButton::menu-indicator {subcontrol-origin: padding; subcontrol-position: right center; right:5px;}");
        menu_->setStyleSheet("QLabel {font-family: Arial; font-size: 13pt; padding: 5px 0 5px 0; background-color: transparent;}"
            "QLabel:hover {background-color: rgb(51, 153, 255);}");
    }
    
    void QTDropDownButton::addItem(QString text)
    {
        if(!menu_)
            return;
    
        QWidgetAction* wa1 = new QWidgetAction(menu_);
        QLabel* l1 = new QLabel(text);
        wa1->setDefaultWidget(l1);
        menu_->addAction(wa1);
    }
    
    void QTDropDownButton::menuAboutToShow()
    {
        if(menu_)
        {
            menu_->setFixedWidth(this->width());
        }
    }
    
    void QTDropDownButton::menuTriggered(QAction *action)
    {
        if(!action)
            return;
    
        QWidgetAction* qwa = dynamic_cast<QWidgetAction*>(action);
        if(!qwa)
            return;
    
        QLabel* ql = dynamic_cast<QLabel*>(qwa->defaultWidget());
        if(!ql)
            return;
    
        setText(ql->text());
    }

    使用QTDropDownButton

    QTDropDownButton* ddb = new QTDropDownButton("Please select");
    ddb->addItem("Option1");
    ddb->addItem("Option2");

  • 相关阅读:
    SQL Server 锁的 8 种类型
    MYSQL 提取时间中的信息的 4 方法
    MYSQL 时间计算的 3 种函数
    MYSQL 的 6 个返回时间日期函数
    SQL Server 错误18456
    MYSQL <=>运算符
    django比较相等或者不相等的模板语法ifequal / ifnotequal
    django模板语言的注释
    ECharts修改坐标轴,坐标轴字体,坐标轴网格样式以及控制坐标轴是否显示
    http://www.cnblogs.com/linxiyue/p/8244724.html
  • 原文地址:https://www.cnblogs.com/ldlchina/p/4667796.html
Copyright © 2011-2022 走看看