因为QComboBox没有自定义的clink信号,所以自己新建一个MyComBox类继承QComboBox,并且添加自定义的左击信号,以及使用该信号连接一个槽函数
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
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); //将该事件传给父类处理,这句话很重要,如果没有,父类无法处理本来的点击事件
}
mainwindows.cpp
connect(ui->mycomboBox1, SIGNAL(clicked()), this,SLOT(mycomboBox_slot()));
在ui界面添加一个原来的控件QComboBox,然后把这个控件提升为MyComboBox就可以使用了。具体步骤为:打开ui界面----->>选中QComboBox控件,右击----->>选择“提升为”----->>在“提升的类名称里面”填入新建的类“MyComboBox”名称----->>点击“添加”按钮----->>再点击“提升”按钮
点击上图中的clicked()自动在mainwindows.cpp中生成
自动生成的槽函数名是on_控件名字_信号名字() 重点!!!
你会发现使用ui界面自动生成的槽函数和信号,没有connect操作,那他们是怎么连接到一块的呢?
这里没有发现用 connect() 函数进行mycomboBox1的信号与槽函数关联的操作。这些功能是如何实现的呢?
查看编译生成的 ui_mainwindow.h 文件。构造函数里调用的 setupUi() 是在 ui_mainwindow.h 文件里实现的。查看 setupUi() 函数的内容,也没有发现用 connect() 函数进行mycomboBox1的信号与槽关联的操作,只是在 setupUI()里发现了如下的一条语句:
QMetaObject::connectSlotsByName(MainWindow);
秘密就在于这条语句。connectSlotsByName(QMainWindow) 函数将搜索 QMainWindow界面上的所有组件,将信号与槽函数匹配的信号和槽关联起来,它假设槽函数的名称是:
void on__();
例如,通过 UI 设计器的操作,为 mycombobox1 自动生成的槽函数是:
void on_mycomboBox1_clicked();
它就正好是 mycomboBox1的信号 clicked() 的槽函数。那么,connectSlotsByName() 就会将此信号和槽函数关联起来,如同执行了下面的这样一条语句:
connect(mycomboBox1, SIGNAL(clicked ()),
this, SLOT (on_mycomboBox1_clicked());
这就是用 UI 设计器可视化设计某个组件的信号响应槽函数,而不用手工去将其关联起来的原因,都是在界面类的构造函数里调用 setupUi() 自动完成了关联。