linux系统中QT里面信号与槽的实现方法

简介: linux系统中QT里面信号与槽的实现方法

第一:QT中信号与槽简介

       在学习Qt的过程中,信号与槽是必不可少的部分,也是QT编程的基础。后面进行QT信号与槽开发的时候,统一采用代码绘制界面,可以锻炼我们的布局能力,和代码逻辑能力。

       信号与槽是QT的编程基础,因为有了信号与槽的编程机制,在QT中处理界面各个组件交互操作时变得更加直观和简单。

       信号就是在特定情况下被发射的事件,例如PushButton最常见的信号就是鼠标点击时发射的clicked()信号等。

       GUI程序设计的主要内容就是对界面上各组件的信号的响应,只需要知道什么情况下发射哪些信号,合理地去响应和处理这些信号就可以了。

       槽(Slot)就是对信号响应的函数。槽函数是一个函数,与一般的C++函数是一样的,可以定义在类的任何部分(public\private或protected),可以具有任何参数,也可以直接被调用。槽函数与一般的函数不同的是:槽函数可以与一个信号关联,当信号被发射时,关联的槽函数被自动执行。

       信号与槽关联是用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()是槽函数的名称,需要带括号,有参数时还需要指明参数。

第二:如何在项目里创建信号

       由于信号只需声明,无需定义。所以我们只需要在 mianwindow.h 里声明信号即可。代码如 下,如下图黑色加粗部分代码就是创建的信号。

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
signals:
    //声明一个信号,只需要声明,无需定义
    void pushButtonTextChanged();
private slots:
    void on_pushButton_clicked();
private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

第三:如何在项目中创建槽

        创建槽的方法也很简单,也是直接在 mianwindow.h 里直接声明槽,在 mianwindow.cpp 里 实现槽的定义,声明槽必须写槽的定义(定义指函数体的实现),否则编译器编译时将会报错

槽有以下特点:

       1. 槽可以是任何成员函数、普通全局函数、静态函数

       2. 槽函数和信号的参数和返回值要一致

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QPushButton>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
signals:
    //声明一个信号,只需要声明,无需定义
    void pushButtonTextChanged();
private slots:
    void on_pushButton_clicked();
    //声明一个槽函数
    void changeButtonText();
    //声明按钮点击的槽函数
    void pushButtonClicked();
private:
    Ui::MainWindow *ui;
    //声明一个对象pushButton
    QPushButton *pushButton;
};
#endif // MAINWINDOW_H

第四:项目中连接信号与槽

派生类::派生类构造函数(总参数列表):基类构造函数(参数列表)  //基类构造函数的参数列表是实参。

{

派生类中的数据成员初始化;

}

信号槽连接的代码如下。

connect(pushButton, SIGNAL(clicked()), this, SLOT(pushButtonClicked()));

connect(this, SIGNAL(pushButtonTextChanged()), this, SLOT(changeButtonText()));

具体代码实现如下:

#include "mainwindow.h"
 MainWindow::MainWindow(QWidget *parent)
 : QMainWindow(parent)
 {
 /* 设置窗体的宽为 800,高为 480 */
 this->resize(800,480);
 /* 实例化 pushButton 对象 */
 pushButton = new QPushButton(this);
 /* 调用 setText()方法设定按钮的文本 */
 pushButton->setText("我是一个按钮");
 /* 信号与槽连接 */
 connect(pushButton, SIGNAL(clicked()), this,SLOT(pushButtonClicked()));
 connect(this, SIGNAL(pushButtonTextChanged()), this,SLOT(changeButtonText()));
}
 MainWindow::~MainWindow()
 {
 }
/* 实现按钮点击槽函数 */
 void MainWindow::pushButtonClicked()
{
 /* 使用 emit 发送信号 */
 emit pushButtonTextChanged();
}
/* 实现按钮文本改变的槽函数 */
 void MainWindow::changeButtonText()
 {
 /* 在槽函数里改变按钮的文本 */
 pushButton->setText("被点击了!");
}

分析:连接信号与槽,整个流程就是当点击了按钮,然后触发了 pushButtonClicked()pushButtonClicked()槽里发送 pushButtonTextChanged()信号,changeButtonText()槽响应 pushButtonTextChanged()信号,我们在 changeButtonText()槽实现响应的动作(事件)。最终的实现效果是按钮的文本由“我是一个按钮”被点击时变成“被点击 了!”

目录
相关文章
|
2月前
|
缓存 监控 Linux
Linux系统清理缓存(buff/cache)的有效方法。
总结而言,在大多数情形下你不必担心Linux中buffer与cache占用过多内存在影响到其他程序运行;因为当程序请求更多内存在没有足够可用资源时,Linux会自行调整其占有量。只有当你明确知道当前环境与需求并希望立即回收这部分资源给即将运行重负载任务之前才考虑上述方法去主动干预。
774 10
|
2月前
|
安全 Linux 数据安全/隐私保护
为Linux系统的普通账户授予sudo访问权限的过程
完成上述步骤后,你提升的用户就能够使用 `sudo`命令来执行管理员级别的操作,而无需切换到root用户。这是一种更加安全和便捷的权限管理方式,因为它能够留下完整的权限使用记录,并以最小权限的方式工作。需要注意的是,随意授予sudo权限可能会使系统暴露在风险之中,尤其是在用户不了解其所执行命令可能带来的后果的情况下。所以在配置sudo权限时,必须谨慎行事。
324 0
|
2月前
|
Ubuntu Linux 开发者
国产 Linux 发行版再添新成员,CutefishOS 系统简单体验
当然,系统生态构建过程并不简单,不过为了帮助国产操作系统优化生态圈,部分企业也开始用国产操作系统替代 Windows,我们相信肯定会有越来越多的精品软件登录 Linux 平台。
120 0
|
2月前
|
Ubuntu 安全 Linux
Linux系统入门指南:从零开始学习Linux
Shell脚本是一种强大的自动化工具,可以帮助您简化重复的任务或创建复杂的脚本程序。了解Shell脚本的基本语法和常用命令,以及编写和运行Shell脚本的步骤,将使您更高效地处理日常任务。
210 0
|
2月前
|
Ubuntu Linux 图形学
Linux学习之Linux桌面系统有哪些?
Cinnamon:与MATE类似,Cinnamon 拥有 GNOME 和 Unity 等其它桌面环境所没有的种种功能,是高度可定制的桌面环境,不需要任何外部插件、窗口组件和调整工具来定制桌面。
126 0
|
Linux 编译器 Shell
Linux系统下实现QT程序打包发布
Linux系统下实现QT程序打包发布
2168 0
|
28天前
|
Unix Linux 程序员
Linux文本搜索工具grep命令使用指南
以上就是对Linux环境下强大工具 `grep` 的基础到进阶功能介绍。它不仅能够执行简单文字查询任务还能够处理复杂文字处理任务,并且支持强大而灵活地正则表达规范来增加查询精度与效率。无论您是程序员、数据分析师还是系统管理员,在日常工作中熟练运用该命令都将极大提升您处理和分析数据效率。
104 16
|
20天前
|
Linux
linux命令—stat
`stat` 是 Linux 系统中用于查看文件或文件系统详细状态信息的命令。相比 `ls -l`,它提供更全面的信息,包括文件大小、权限、所有者、时间戳(最后访问、修改、状态变更时间)、inode 号、设备信息等。其常用选项包括 `-f` 查看文件系统状态、`-t` 以简洁格式输出、`-L` 跟踪符号链接,以及 `-c` 或 `--format` 自定义输出格式。通过这些选项,用户可以灵活获取所需信息,适用于系统调试、权限检查、磁盘管理等场景。
|
3月前
|
监控 Linux 网络安全
Linux命令大全:从入门到精通
日常使用的linux命令整理
669 13
|
4月前
|
Linux 网络安全 数据安全/隐私保护
使用Linux系统的mount命令挂载远程服务器的文件夹。
如此一来,你就完成了一次从你的Linux发车站到远程服务器文件夹的有趣旅行。在这个技术之旅中,你既探索了新地方,也学到了如何桥接不同系统之间的距离。
558 21