电子说
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()槽函数被触发运行,从而emit出pushButtonTextChanged()信号,进而触发changeButtonText()槽函数实现文本的切换
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !