Qt编程基础之信号与槽机制

电子说

1.3w人已加入

描述

 

1. 信号与槽机制

信号与槽(Signal & Slot)是Qt编程的基础,因为信号与槽的编程机制,在Qt中处理界面各个组件的交互操作时变得更加直观和简单。信号是在特定情况下被发射的事件,槽就是对信号响应的函数。信号与槽关联是用QObject::connect()函数实现的,其基本格式是:

			

QObject::connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));

connect()是QObject类的一个静态函数,而QObject是所有Qt类的基类,在实际调用时可以忽略前面的限定符,所以可以直接写为:

connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));
//sender:发射信号的对象 
//signal():是信号名称。信号可以看做是特殊的函数, 需要带括号,有参数时还需要指明参数。
//receiver:接收信号的对象 
//slot():槽函数的名称,需要带括号,有参数时还需要指明参数。

SIGNAL和SLOT是Qt的宏,用于指明信号和槽,并将它们的参数转换为相应的字符串。也可以不使用这两个宏,而使用双引号代替:

connect(sender, "signal()", receiver, "slot()");

 

2. 信号与槽的连接方式

在使用信号与槽的类中,必须在类的定义中加入宏Q_OBJECT。当一个信号被发射时,与其关联的槽函数会被立即执行,就像正常调用一个函数一样。只有当信号关联的所有槽函数执行完毕后,才会执行发射信号处后面的代码。

 一个信号连接多个槽

connect(pushButton, SIGNAL(clicked()), this, SLOT(hide());
connect(pushButton, SIGNAL(clicked()), this, SLOT(close());

 多个信号连接一个槽

connect(pushButton1, SIGNAL(clicked()), this, SLOT(close()));
connect(pushButton2, SIGNAL(clicked()), this, SLOT(close()));
connect(pushButton3, SIGNAL(clicked()), this, SLOT(close()));

 一个信号连接另一个信号

connect(pushButton, SIGNAL(objectNameChanged(QString)),this, SIGNAL(windowTitelChanged(QString)));

 

3. 信号与槽的创建

Qt 里有大量自定义好的信号与槽, 基本够我们使用。若没有找到想要的信号与槽,就需要定义自己的信号和槽了

 创建信号:在mianwindow.h里声明信号即可,无需定义
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include 
#include 

class MainWindow : public QMainWindow
{
  Q_OBJECT

public:
  MainWindow(QWidget *parent = nullptr);
  ~MainWindow();

signals:
  /* 声明一个信号,只需声明,无需定义 */
  void pushButtonTextChanged();
};
#endif
 创建槽:在mianwindow.h里声明槽,在mianwindow.cpp里实现槽的定义
/***** 在 mianwindow.h 里直接声明槽 *****/
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include 
#include 

classMainWindow:public QMainWindow
{
  Q_OBJECT

public:
  MainWindow(QWidget *parent =nullptr);
  ~MainWindow();

signals:     //声明一个信号,只需声明,无需定义
  voidpushButtonTextChanged();

public slots:
  voidchangeButtonText();    //声明切换文本槽函数
  voidpushButtonClicked();   //声明按钮点击槽函数

private:
  QPushButton *pushButton;   //声明对象
};
#endif 
/***** 在 mianwindow.cpp 里实现槽的定义 *****/
/* 实现按钮点击槽函数 */
void MainWindow::pushButtonClicked()
{
  emit pushButtonTextChanged(); //使用emit发送信号
}

/* 实现按钮文本改变的槽函数 */
void MainWindow::changeButtonText()
{
  pushButton->setText("I was clicked!");
}

 信号与槽的连接:在mainwindow.cpp中连接信号与槽

MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
  this->resize(800,480);
  pushButton = new QPushButton(this);   //实例化按钮对象
  pushButton->setText("I am a Button"); //设定按钮的文本
  /* 信号与槽连接 */
  connect(pushButton, SIGNAL(clicked()), this, SLOT(pushButtonClicked()));
  connect(this, SIGNAL(pushButtonTextChanged()), this, SLOT(changeButtonText()));
}

上面代码编译运行后如下图示,点击按钮后,pushButtonClicked()槽函数被触发运行,从而emitpushButtonTextChanged()信号,进而触发changeButtonText()槽函数实现文本的切换

Qt

 

Qt

  审核编辑:汤梓红


打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分