Qt 信号和槽机制

一. 简介

        在Qt中使用信号和槽机制来完成对象之间的协同操作。简单来说,信号和槽都是函数,比如按下窗口上的一个按钮后想要弹出一个对话框,那么就可以将这个按钮的单击信号和我们定义的槽关联起来,在这个槽中可以创建一个对话框,并且显示它。这样,当单击这个按钮时就会发射信号,进而执行我们的槽来显示一个对话框。

        实际上,我们一般需要自己实现的是槽函数。槽函数即:接收到信号后所要执行的动作。

二. 声明

/*
 * 使用关键字:signals,来声明信号函数
 */
signals:
    void sig_updateNtpTime(QString *time);

/*
 * 使用关键字:slots,来声明槽函数。
 * 一般槽函数需要指明权限:public/private/protected等
 */
public slots:
    void slot_receiveTime(QString *time);

注意: 槽一般使用slots关键字进行修饰(Qt 4中必须使用,Qt 5以后使用新connect语法时可以不用,为了与一般函数进行区别,建议使用)

三. 信号的类别

1)基于部件对象,可以使用其类中自带的信号(比如:按钮部件,其类中自带的信号)

/* 
 * 1)clicked(): 被点击
 * 2) clicked(bool):被点击,区分是否被选中(一般在单选框部件中使用)
 * 3)pressed(): 按钮被按下
 * 4)released(): 按钮被松开
 */

2)自定义信号

/*
 * 使用关键字:signals,来自定义信号
 */
signals:
    void sig_updateNtpTime(QString *time);

四. 信号和槽的关联方式

1.  使用connect()函数关联

// 函数原型
QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method)
// connect()函数中的四个参数分别是:发送信号的对象、发送的信号、接收信号的对象和要执行的槽。

信号触发形式:

1)使用部件对象自带的信号

connect(ui->button, SIGNAL(clicked()), this, SLOT(slot_exitsCardsDevice()));
// 当点击按钮button时,触发信号-->执行槽函数 slot_exitsCardsDevice().

2)使用自定义的信号

connect(ui->functionBtn_1, SIGNAL(sig_mouseReleaseEvent()), this, SLOT(slot_functionBtn_1_clickedX()));

//使用关键字:emit,来触发自定义信号

emit sig_mouseReleaseEvent();//执行后,触发槽函数 slot_functionBtn_1_clickedX()

2. 自动关联

        在设计模式中的UI主设计区,选择需要操作的部件,右击,在弹出的菜单上选择“转到槽”,根据需求选择对应的槽函数。

        自动关联就是将关联函数整合到槽命名中。 例如on_pushButton_clicked()就是由字符“on”和发射信号的部件对象名,还有信号名组成。这样就可以去掉那个connect()关联函数了。每当pushButton被按下,就会发射clicked()信号,然后就会执行on_pushButton_clicked()槽。

//对名称为 pushButton_save 的按钮进行的 按下和释放 动作的槽函数
void frmTelBook::on_pushButton_save_pressed()
{
    //
}

void frmTelBook::on_pushButton_save_released()
{
    //
}

注意:一般自动关联方式的槽函数数目较少,选择性叫少。

相关推荐

  1. 信号(Qt)

    2024-01-18 11:48:02       52 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-18 11:48:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-18 11:48:02       101 阅读
  3. 在Django里面运行非项目文件

    2024-01-18 11:48:02       82 阅读
  4. Python语言-面向对象

    2024-01-18 11:48:02       91 阅读

热门阅读

  1. MySQL如何存储表情符号?

    2024-01-18 11:48:02       63 阅读
  2. HBase学习七:Compaction

    2024-01-18 11:48:02       55 阅读
  3. 线上部署springboot和vue开发的博客需要替换的地方

    2024-01-18 11:48:02       46 阅读
  4. 剑指offer面试题6 重建二叉树

    2024-01-18 11:48:02       50 阅读