Qt 上QComboBox实现鼠标点击触发


  • 项目组组长

    前段时间在Qt上做东西的时候,提出了一个奇怪的需求(至少我觉得是挺奇怪的)。让 ui 中的 QComboBox 控件有点击交互,QComboBox 控件其实就是一个下拉框样式的控件,这个下拉框提供的交互是点击之后会展开所有的选项,用户选择后将会发出信号,也就是选择改变的信号,设计者接收这个信号到槽就可以捕捉用户的选择更改了。然而,要求实现的是点击此框,即会触发一次所选项的更新。
    在该控件的信号和槽查找之后并没有找到相应的信号和槽,经过查找资料发现并没有这个功能的支持。但是这个功能还是可以自己实现的, 比较简单,在此记录一下。

    1. 新增MyComboBox.h
    #ifndef MYCOMBOBOX_H
    #define MYCOMBOBOX_H
     
    #include <QComboBox>
    #include <QMouseEvent>
    class MyComboBox : public QComboBox
    {
        Q_OBJECT    //只有加入Q_OBJECT,才能使用信号signal和槽slot的机制
    public:
        explicit MyComboBox(QWidget *parent = 0);
        ~MyComboBox();
    protected:
        virtual void mousePressEvent(QMouseEvent *e);  //添加鼠标点击事件
     
    signals:
        void clicked();  //自定义点击信号,在mousePressEvent事件发生时触发
    };
     
    #endif // MYCOMBOBOX_H
    
    
    1. 新增 MyComboBox.cpp
    #include "mycombobox.h"
     
    MyComboBox::MyComboBox(QWidget *parent):QComboBox(parent)
    {
     }
     
    MyComboBox::~MyComboBox()
    {
    }
     
    void MyComboBox::mousePressEvent(QMouseEvent *event)
    {
        if(event->button() == Qt::LeftButton)
        {
            emit clicked();  //触发clicked信号
        }
     
        QComboBox::mousePressEvent(event);  //将该事件传给父类处理,这句话很重要,如果没有,父类无法处理本来的点击事件
    }
    
    
    1. 如何调用?
      在 ui 设计界面右击一个QComboBox,选择“提升为”,在“提升的类名称里面”填入新建的类“MyComboBox”名称,点击“添加”按钮,再点击“提升”按钮,就OK了。
      ①可以通过函数调用
      **.h中增加 一个 slot 函数, 再用connect 连接信号和槽就可以了!
      connect(ui->comboBox, SIGNAL(clicked()), this, SLOT(on_comboBox_clicked()));
      ②在ui界面右击控件跳转到槽

    Qt 是个好东西。


 

Copyright © 2018 bbs.dian.org.cn All rights reserved.

与 Dian 的连接断开,我们正在尝试重连,请耐心等待