一、什么是信号与槽?
在Qt框架中,信号与槽(Signal and Slot)机制是其核心特性之一,它提供了一种高效且安全的方式来处理对象之间的通信。信号与槽机制基于观察者模式,允许一个对象(信号发出者)在特定事件发生时通知另一个或多个对象(槽接收者)。
二、概念详解
1.信号(Signal)
信号是Qt对象中的特殊成员函数,当特定事件发生时,它会被自动调用。信号本身并不执行任何操作,它只是简单地发出一个通知。信号的声明需要使用signals
关键字,并且只能声明,不能定义(即没有函数体)。
示例:
class MyButton : public QPushButton {
Q_OBJECT
public:
MyButton(QWidget *parent = nullptr);
signals:
void clicked(); // 信号声明
};
2.槽(Slot)
槽是普通的C++成员函数,可以像其他成员函数一样在类中被声明和使用。槽的主要作用是响应信号,执行相应的操作。槽函数可以是任何访问修饰符(public, protected, private),并且可以被重载。在Qt中,槽函数通常使用slots
关键字进行声明(但在Qt 5中,slots
关键字是可选的)。
示例:
class MyWidget : public QWidget {
Q_OBJECT
public:
MyWidget(QWidget *parent = nullptr);
public slots:
void onButtonClicked(); // 槽声明
};
3.连接(Connect)
连接操作是将信号和槽关联起来的过程。当信号被发射时,与之关联的槽函数会被自动调用。Qt提供了connect()
函数来实现这一功能。
示例:
MyButton *button = new MyButton();
MyWidget *widget = new MyWidget();
connect(button, &MyButton::clicked, widget, &MyWidget::onButtonClicked);
4.断开连接(Disconnect)
在某些情况下,可能需要断开信号和槽之间的连接。Qt提供了disconnect()
函数来实现这一功能。
示例:
disconnect(button, &MyButton::clicked, widget, &MyWidget::onButtonClicked);
三、举例
我们定义一个自定义的MyButton
类,它继承自QPushButton
。在MyButton
的构造函数中,我们使用connect()
函数将clicked()
信号与onButtonClicked()
槽函数连接起来。当按钮被点击时,clicked()
信号会被发射,从而触发onButtonClicked()
槽函数的执行。在onButtonClicked()
槽函数中,我们使用QMessageBox::information()
函数弹出一个信息框来显示“Button clicked!”的消息。
#include <QApplication>
#include <QPushButton>
#include <QMessageBox>
class MyButton : public QPushButton {
Q_OBJECT
public:
MyButton(QWidget *parent = nullptr) : QPushButton(parent) {
connect(this, &MyButton::clicked, this, &MyButton::onButtonClicked);
}
private slots:
void onButtonClicked() {
QMessageBox::information(this, "Information", "Button clicked!");
}
};
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
MyButton button;
button.setText("Click Me!");
button.show();
return app.exec();
}
标签:clicked,函数,入门,MyButton,onButtonClicked,信号,public,QT
From: https://blog.csdn.net/weixin_45843323/article/details/140087991