在QT中的ui界面添加QComboBox控件,需求是实现控件的点击事件,查了资料,发现这个控件类的本身是没有点击信号可以使用的,提供的信号为

void

activated(int index)

void

activated(const QString & text)

void

currentIndexChanged(int index)

void

currentIndexChanged(const QString & text)

void

editTextChanged(const QString & text)

void

highlighted(int index)

void

highlighted(const QString & text)

具体可以参考官方说明:QComboBox Class | Qt 4.8

但是QT是基于C++的面向对象,有了这个特点,我们就可以继承原来的类,然后重写里面的方法来实现基类中没有的方法,比如 clicked 事件。在QComboBox 中添加鼠标点击事件的步骤为首先新建一个类(MyComboBox),继承QComboBox类,然后在新建的类里面添加mousePressEvent事件,mousePressEvent是QT里面的鼠标点击事件,直接就能用,接着在这个mousePressEvent事件函数里面触发自定义的 clicked 信号,这样就实现在 QComboBox 里面实现鼠标点击的事件。

代码:

新建一个MyComboBox类。

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

2、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);  //将该事件传给父类处理,这句话很重要,如果没有,父类无法处理本来的点击事件
}

这样对 QComboBox 的重写就完成了,我们就可以使用具有鼠标点击响应的 MyComboBox 这个类了。在这里解释一下 emit,emit 是QT里面的一个关键字,意思是触发一个信号,这里的话是触发我们在 MyComboBox.h 这个头文件中自定义的 clicked 信号。

那这个新建的 MyComboBox 应该怎么用呢?

方法1> 如果是想要在代码中直接新建的话,就是通过平时的类的实例化就行。

例如:

MyComboBox* myComboBox = new MyComboBox();

这样实例化是没有绑定父组件的,可以在父组件中通过addWidget的方式,添加这个新建的组件。

也可以在实例化的时候绑定父组件,然后进行布局、位置、大小进行设置。

方法2> 如果是直接在ui界面上面添加的话,我们可以先在ui界面添加一个原来的控件ComboBox,然后把这个控件提升为 MyComboBox 就可以使用了。

具体步骤为:打开ui界面----->>选中QComboBox控件,右击----->>选择“提升为”----->>在“提升的类名称里面”填入新建的类“MyComboBox”名称----->>点击“添加”按钮----->>再点击“提升”按钮。具体图解如下:

1、输入提升的类的名称

python 给combox赋值_qt

 2、点击“添加”按钮,可以看到窗口的上面已经添加进入。

python 给combox赋值_点击事件_02

 3、点击“提升”即可(添加提升时要注意MyComboBox.h的名称要和实际的MyComboBox.h文件名称要一致,大小写也要一致。还要在右键“改变信号/槽”-“信号”里添加一个 clicked 信号事件)

现在我们ui中的QComboBox控件就有了鼠标点击响应事件了,在代码中就可以像按钮的点击事件那样使用 信号/槽机制来使用啦。这里我还是举个例子来说明下吧。

我是在widget这个类里面使用的。

1、在widge.h头文件里面添加槽函数的定义,这个槽函数的名字是我根据项目需求定义的。

private slots:
    void getPadIds();

2、在widget.cpp中的构造函数中用connect来连接clicked信号和getPadIds槽函数,并且定义getPadIds槽函数,为了测试,只是显示一句话在文本显示框中。

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{ 
    ui->setupUi(this);
    
    connect(ui->comboBox, SIGNAL(clicked()), this, SLOT(getPadIds()));
}
void Widget::getPadIds()
{
    if(ui->comboBox->count() == 0)
    {
        ui->textBrowser->append("there is no PadIds!\n");
    }
}

当点击QComboBox控件时,就会触发自定义的clicked信号,从而进入getPadIds槽函数,实现了QComboBox鼠标点击响应的功能。