系列文章目录
Qt开发笔记(一)Qt的基础知识及环境编译(泰山派)
Qt学习笔记(二)Qt 信号与槽
前言
在学习 Qt 的过程中,信号与槽是必不可少的部分,也是 Qt 编程的
基础,是 Qt 编程的一大创新,这里分一个章节来学习这个 Qt 的信号与槽。
一、Qt 信号与槽机制
1.1 什么是信号和槽
信号(Signal)就是在特定情况下被发射的事件,例如 PushButton 最常见的信号就是鼠标单击时发射的 clicked() 信号,一个 ComboBox 最常见的信号是选择的列表项变化时发射的CurrentIndexChanged() 信号。GUI 程序设计的主要内容就是对界面上各组件的信号的响应,只需要知道什么情况下发射哪些信号,合理地去响应和处理这些信号就可以了。
槽(Slot)就是对信号响应的函数。槽就是一个函数,与一般的 C++函数是一样的,可以定义在类的任何部分(public、private 或 protected),可以具有任何参数,也可以被直接调用。槽函数与一般的函数不同的是:槽函数可以与一个信号关联,当信号被发射时,关联的槽函数被自动执行。
1.1 信号和槽的关联及断连
信号与槽关联是用 QObject::connect() 函数实现的,它是connect() 是 QObject 类的一个静态函数,其基本格式是:
// 完整格式
QObject::connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));
// 在实际调用时可以忽略前面的限定符
connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));
其中,sender 是发射信号的对象的名称,signal() 是信号名称。信号可以看做是特殊的函数,需要带括号,有参数时还需要指明参数。receiver 是接收信号的对象名称,slot() 是槽函数的名称,需要带括号,有参数时还需要指明参数。
断开连接需要使用 disconnect()函数,其格式如下:
// 断开一切与 myObject 连接的信号或槽
bool QObject::disconnect(sender,SIGNAL(signal()), receiver, SLOT(slot()));
信号与槽机制是 Qt GUI 编程的基础,使用信号与槽机制可以比较容易地将信号与响应代码关联起来。我们在平常编辑的时候可以直接利用UI设计器进行编辑(自动关联),当运行之后会自动生成Ui_MainWindow.h文件。
二、编辑槽函数
1. 自动关联
右键我们的控件,选择转到槽,然后选择一个触发方式,之后便会在mainwindow.cpp文件下生成一个槽函数,并在mainwindow.h下进行申明。这里要特别注意,槽函数只能申明在private slots 或者public slots下。
在生成的on_connect_clicked( )槽函数中进行功能编辑,笔者这里是进行了一个打印功能。
执行之后可以看到,下方的控制窗口已经打印出来了信息。
2. 手动关联
这种方式需要用的我们上文提到的connect和disconnect函数,主要是服务于大型项目。它可以自定义更多槽函数功能和名称,具有极大的灵活性,同时由于所有界面都在代码中定义,避免了 UI 文件和逻辑代码分离带来的管理复杂性,所有人都能在代码中找到界面和逻辑。以下是手动关联的基本流程:
- 创建项目与 UI 设计
假设你已经在 Qt Designer 中设计了一个简单的窗口(也可以纯代码编写),包含一个按钮 pushButton 和一个标签 label。 - 创建 C++ 类
创建一个 C++ 类并添加信号的声明,通常是继承自 QMainWindow 或 QWidget。
// 头文件 mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
signals:
void myCustomSignal(); // 声明自定义信号
private slots: // 声明槽函数
void onButtonClicked();
private:
Ui::MainWindow *ui; // UI 指针
};
#endif // MAINWINDOW_H
- 实现构造函数与析构函数
// 源文件 mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this); // 设置 UI
// 手动连接信号与槽
connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(onButtonClicked())); // 连接按钮的点击信号到槽
}
MainWindow::~MainWindow()
{
delete ui;
}
- 实现槽函数
在 mainwindow.cpp 中,实现槽函数,这部分同上文自动关联。
免责声明:本文参考了网上公开的部分资料,仅供学习参考使用,若有侵权或勘误请联系笔者。
本站资源均来自互联网,仅供研究学习,禁止违法使用和商用,产生法律纠纷本站概不负责!如果侵犯了您的权益请与我们联系!
转载请注明出处: 免费源码网-免费的源码资源网站 » Qt学习笔记(二)Qt 信号与槽
发表评论 取消回复