QT::QComboBox自定义左击事件信号

因为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() 自动完成了关联。

Qt中,可以通过信号和槽机制来实现多个QComboBox之间的数据实时同步。 首先,创建多个QComboBox对象,并设置它们的初始数据。然后,为每一个QComboBox连接一个槽函数,用于处理QComboBox的当前选择改变的信号。 在槽函数中,可以通过sender()函数获取发送信号QComboBox对象,然后使用currentIndex()函数获取当前选择的索引,再通过itemText()函数或者currentText()函数获取当前选择的文本。 接着,可以通过循环遍历所有的QComboBox对象,并使用setCurrentIndex()函数或者setCurrentText()函数将其他QComboBox对象的选择与发送信号QComboBox对象保持一致。 这样,当任何一个QComboBox的选择改变时,其它所有的QComboBox也会实时更新为相同的选择。 示例代码如下所示: ```cpp // 多个QComboBox对象的指针 QComboBox* comboBox1; QComboBox* comboBox2; QComboBox* comboBox3; // 设置初始数据 comboBox1->addItem("选项1"); comboBox1->addItem("选项2"); comboBox1->addItem("选项3"); comboBox2->addItem("选项1"); comboBox2->addItem("选项2"); comboBox2->addItem("选项3"); comboBox3->addItem("选项1"); comboBox3->addItem("选项2"); comboBox3->addItem("选项3"); // 连接信号和槽函数 connect(comboBox1, SIGNAL(currentIndexChanged(int)), this, SLOT(syncComboBoxData())); connect(comboBox2, SIGNAL(currentIndexChanged(int)), this, SLOT(syncComboBoxData())); connect(comboBox3, SIGNAL(currentIndexChanged(int)), this, SLOT(syncComboBoxData())); // 槽函数实现 void MyClass::syncComboBoxData() { QComboBox* senderComboBox = qobject_cast<QComboBox*>(sender()); int currentIndex = senderComboBox->currentIndex(); QString currentText = senderComboBox->currentText(); // 循环遍历所有的QComboBox对象 foreach(QObject* obj, this->children()) { QComboBox* comboBox = qobject_cast<QComboBox*>(obj); if(comboBox && comboBox != senderComboBox) { comboBox->setCurrentIndex(currentIndex); // 或者使用comboBox->setCurrentText(currentText); } } } ``` 通过上述步骤,多个QComboBox对象的数据将会实时同步,保持相同的选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值