QT编程之信号和槽机制知识

2023-11-20

qt知识总结

一.常见的父窗口有3类:

1.QWidget:它是所有对象的基类-继承自QOject和OPaintDevice

2.QMainWindow:它提供了一个主要的应用窗口,可以用来构建APP的应用界面。

3.QDialog:对话框

其中QMainWindow和QDialog是QWidget的子类。

使用父窗口的好处:可以使得创建的控件停靠在某个父窗口的上面,这时控件将位于父窗口的内部,随着父窗口一起移动,隐藏显示,否则将作为独立窗口显示在屏幕上,一个控件占据一个窗口。

父窗口

1.父窗口的析构函数返回的时候会自动销毁子窗口对象,如果子窗口对象是通过new操作符创建的,可以不显示的执行delete操作,不会造成内存泄漏的现象。

如下代码所示:

int main(int argc, char *argv[])
{
    //创建QT应用程序对象
    QApplication app(argc, argv);
//    QWidget parent;
//    QMainWindow parent;
    QDialog parent;
    parent.move(100,100);
    parent.resize(320,320);
//    labe标签停靠在父窗口上
    QLabel label("i am label",&parent);
    label.move(30,30);
//    button标签停靠在父窗口上
    QPushButton button("i am button",&parent);
    button.move(30,100);
    button.resize(100,50);
//    堆区创建的对象,这里指定了父窗口的指针,所以可以不需要显示的delete,避免内存泄漏。
    QPushButton* button1 =new QPushButton("我是按钮",&parent);
    button1->resize(100,50);
    button1->move(200,100);
//    父窗口显示的时候,上面停靠的窗口也将会显示
    parent.show();
//    这句话不能写,写了之后就看不到button1按钮了,它会释放资源,由于事件循环没有退出。当事件循环退出的时候,由于app是栈区开辟的,它在释放自身
//    空间的同时,父窗口对象销毁的时候,对应的对象会被自动销毁。
//     delete button1;
//  让应用程序进入事件循环,等待窗口的关闭
    return app.exec();
}

信号和槽机制(最重要的机制)

信号和槽机制:是两个对象之间建立通信方式的一种机制。

当一个控件发生改变的时候,它会发出某个信号(比如鼠标点击按钮,拖动滑动条等),另一个对象收到该信号之后,就会触发对应的槽函数(slot),(类似于linux中进程接收到信号之后会触发对应的信号处理函数)从而该对象会作出相对应的处理。

信号和槽机制主要是通过connect函数完成的定义,具体定义如下:注意,该函数是静态函数。

[static] QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)

第一个参数是发送者的地址,第二个参数是字符串指针(代表相对应的信号),第三个参数是接受对象的地址,第四个对象是对应的槽函数方法。第五个参数是连接类型,默认是自动连接,具备默认参数值,不需要用户指定。

注意点

1.对应的signal和method必须通过SIGNAL和SLOT宏将对应的函数进行转换为字符型常量指针。

2.给定的signal和method函数的参数只包括类型,不要给定参数名称。下面的方式是错误的,加了value值。

 // wrong!
 QObject::connect(scrollBar, SIGNAL(valueChanged(int value)),
                  label, SLOT(setNum(int value)));

3.对应的语法要求:总结一下即是信号的参数一般都要和槽函数的参数保持一致。
在这里插入图片描述

4.对应的信号和槽的连接的应用
在这里插入图片描述

demo1:

点击按钮1删除标签,点击按钮2退出程序。一旦用户点击按钮之后,QPushButton对象即会发送click信号给Qlabel对象,Qlabel对象接受到信号之后,就会触发自己的槽函数,从而关闭掉对应的标签。

  //创建QT应用程序对象
    QApplication app(argc, argv);
    QDialog parent;
    parent.move(100,100);
    parent.resize(320,320);
    QLabel label("i am label",&parent);
    label.move(30,30);
    QPushButton button("i am button",&parent);
    button.move(30,100);
    button.resize(100,50);
    //点击按钮关闭标签
    QObject::connect(&button,SIGNAL(clicked()),&label,SLOT(close()));
    //点击按钮退出应用程序
    QPushButton button2("退出应用程序",&parent);
    button2.move(150,100);
    button2.resize(100,50);
//    QObject::connect(&button2,SIGNAL(clicked()),&app,SLOT(closeAllWindows()));
    QObject::connect(&button2,SIGNAL(clicked()),&parent,SLOT(close()));
    parent.show();
    return app.exec();

demo2

创建滑块(QSlider)和选址框(QSpinBox),使得两者可以同步发生改变。

int main(int argc, char *argv[])
{
    //创建QT应用程序对象
    QApplication app(argc, argv);
    QDialog parent;
    parent.move(100,100);
    parent.resize(320,320);
    QSlider slider(Qt::Horizontal,&parent);
    slider.move(20,100);
    QSpinBox spinbox(&parent);
    spinbox.move(120,100);
    slider.setRange(0,200);
    spinbox.setRange(0,200);
    //关键代码就是这两句,当滑块进行滑动的时候,对应的值会发生改变,因此会发送信号,此时spinbox会重新设定选框的数值。
    QObject::connect(&slider,SIGNAL(valueChanged(int)),&spinbox,SLOT(setValue(int)));
    // 同理当选框的数值发生改变之后,也会发生信号,从而滑块当前的数值会被重新设定。
    QObject::connect(&spinbox,SIGNAL(valueChanged(int)),&slider,SLOT(setValue(int)));
    parent.show();
    return app.exec();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QT编程之信号和槽机制知识 的相关文章

  • 具有子列表属性映射问题的自动映射器

    我有以下型号 Models public class Dish Required public Int64 ID get set Required public string Name get set Required public str
  • 查找哪些页面不再与写入时复制共享

    假设我在 Linux 中有一个进程 我从中fork 另一个相同的过程 后forking 因为原始进程将开始写入内存 Linux写时复制机制将为进程提供与分叉进程使用的不同的唯一物理内存页 在执行的某个时刻 我如何知道原始进程的哪些页面已被写
  • OpenCv读/写视频色差

    我试图简单地使用 openCV 打开视频 处理帧并将处理后的帧写入新的视频文件 我的问题是 即使我根本不处理帧 只是打开视频 使用 VideoCapture 读取帧并使用 VideoWriter 将它们写入新文件 输出文件看起来比输入更 绿
  • C#动态支持吗?

    看完之后这个帖子 https stackoverflow com questions 2674906 when should one use dynamic keyword in c sharp 4 0k和链接 我还有 2 个问题 问题 1
  • 为什么我不能用 `= delete;` 声明纯虚函数?

    Intro 纯虚函数使用通用语法声明 virtual f 0 然而 自 c 11 以来 有一种方法可以显式地传达non existence 特殊 成员函数的 Mystruct delete eg default constructor Q
  • 如何配置 WebService 返回 ArrayList 而不是 Array?

    我有一个在 jax ws 上实现的 java Web 服务 此 Web 服务返回用户的通用列表 它运行得很好 Stateless name AdminToolSessionEJB RemoteBinding jndiBinding Admi
  • 暂停下载线程

    我正在用 C 编写一个非常简单的批量下载程序 该程序读取要下载的 URL 的 txt 文件 我已经设置了一个全局线程和委托来更新 GUI 按下 开始 按钮即可创建并启动该线程 我想要做的是有一个 暂停 按钮 使我能够暂停下载 直到点击 恢复
  • 当前的 c++ 工作草案与当前标准有何不同

    通过搜索该标准的 PDF 版本 我最终找到了这个链接C 标准措辞草案 http www open std org jtc1 sc22 wg21 docs papers 2012 n3376 pdf从 2011 年开始 我意识到我可以购买最终
  • 如何识别 WPF 文本框中的 ValidationError 工具提示位置

    我添加了一个箭头来指示工具提示中的文本框 当文本框远离屏幕边缘时 这非常有效 但是当它靠近屏幕边缘时 工具提示位置发生变化 箭头显示在左侧 Here is the Image Correct as expected since TextBo
  • 如何从网站下载 .EXE 文件?

    我正在编写一个应用程序 需要从网站下载 exe 文件 我正在使用 Visual Studio Express 2008 我正在使用以下代码 private void button1 Click object sender EventArgs
  • C 语言中 =+(等于加)是什么意思?

    我碰到 与标准相反 今天在一些 C 代码中 我不太确定这里发生了什么 我在文档中也找不到它 In ancientC 版本 相当于 它的残余物与最早的恐龙骨头一起被发现 例如 B 引入了广义赋值运算符 使用x y to add y to x
  • 如何在c#中的内部类中访问外部类的变量[重复]

    这个问题在这里已经有答案了 我有两个类 我需要声明两个类共有的变量 如果是嵌套类 我需要访问内部类中的外部类变量 请给我一个更好的方法来在 C 中做到这一点 示例代码 Class A int a Class B Need to access
  • 为什么我不应该对不是由 malloc() 分配的变量调用 free() ?

    我在某处读到 使用它是灾难性的free删除不是通过调用创建的对象malloc 这是真的 为什么 这是未定义的行为 永远不要尝试它 让我们看看当您尝试时会发生什么free 自动变量 堆管理器必须推断出如何获取内存块的所有权 为此 它要么必须使
  • 在 C 中使用 GNU automake 中的解析器

    我是 GNU autotools 的新手 在我的项目中使用了 lex 和 yacc 解析器 将它们作为 makefile am 中的源代码会产生以下错误 配置 in AC CHECK PROGS YACC bison yacc none i
  • 有没有一种简单的方法可以让 Visual Studio 2015 使用特定的 ToolsVersion?

    使用特定版本构建项目或解决方案时msbuild我可以使用以下命令选择早期的 net 工具链 toolsversion or tv switch C Program Files x86 MSBuild 14 0 bin msbuild tv
  • 结构体指针的动态数组

    我必须使用以下代码块来完成学校作业 严格不进行任何修改 typedef struct char firstName char lastName int id float mark pStudentRecord pStudentRecord
  • 使用 C# 从 DateTime 获取日期

    愚蠢的问题 给定日期时间中的日期 我知道它是星期二 例如我如何知道它的 tue 2 和 mon 1 等 Thanks 您正在寻找星期几 http msdn microsoft com en us library system datetim
  • 带重定向标准流的 C# + telnet 进程立即退出

    我正在尝试用 C 做一个 脚本化 telnet 项目 有点类似于Tcl期望 http expect nist gov 我需要为其启动 telnet 进程并重定向 和处理 其 stdin stdout 流 问题是 生成的 telnet 进程在
  • 使用 Crypto++ 获取 ECDSA 签名

    我必须使用 Crypto 在变量中获取 ECDSA 签名 我在启动 SignMessage 后尝试获取它 但签名为空 我怎样才能得到它 你看过 Crypto wiki 吗 上面有很多东西椭圆曲线数字签名算法 http www cryptop
  • 匿名结构体作为返回类型

    下面的代码编译得很好VC 19 00 23506 http rextester com GMUP11493 标志 Wall WX Za 与VC 19 10 25109 0 标志 Wall WX Za permissive 这可以在以下位置检

随机推荐

  • Python身份运算符(is , is not) 和比较运算符(==,!=)区别

    学习的时候无意中翻到 就在这里稍微记录一下 从名字上看 身份运算符的意思是 运算 两个对象的身份的 那怎么 运算 两个对象的身份呢 那么就自然而然想到比较两个对象的身份是否是相同的 在这里的身份就是他们的id 也就是内存地址 所以身份运算符
  • 【数据结构】哈夫曼编码与前缀编码

    1 前缀编码 首先对于一个串可以用等长的二进制位表示 这样就叫做固定长度编码 如果可以用不等长的二进制位表示 则称之为可变长度编码 那么对于那些频度高的字符我们采用短二进制位编码 出现频度低的采用长二进制位编码的话 将会极大地减少编码长度
  • Win2012服务器 远程桌面帐户允许多用户同时登录的配置方法(2个用户)

    打开任务栏左下角的 服务器管理器 在左侧列表中选中 本地服务器 然后将右侧 远程桌面 功能的选项修改为 启用 注意取消下面复选框的选中状态 修改本地组策略 允许远程桌面帐户的多用户访问 同时按住 Win键 R 组合键调出运行窗口 输入 gp
  • MySQL cmd窗口输入密码后闪退

    最近重新使用回 MySQL 到官网下载客户端版 MySQL Installer 进行安装时 已经设置过 root 密码为 123456 第一次用 cmd 登录时成功 然后再安装 MySQL Workbench 进行连接 却报了错误 auth
  • 基本的Java的MVC入门案例

    概念 MVC Model View Controller 模型 视图 控制器 他是一种专门设计web程序的模式 高内聚 低耦合 高内聚 专人干专事 低耦合 让类与类之间的关系不能太紧密 模型 Model 是应用程序中与处理应用程序数据逻辑的
  • React抽离组件到独立的JS文件中

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 React学习记录 一 抽离组件到独立的JS文件中 1 先创建一个Hello js 2 再创建一个index js文件 React学习记录 一 抽离组件到独立的JS
  • PHP is_array()函数详解,PHP判断是否为数组

    作者主页 士别三日wyx 作者简介 CSDN top100 阿里云博客专家 华为云享专家 网络安全领域优质创作者 推荐专栏 对网络安全感兴趣的小伙伴可以关注专栏 网络安全入门到精通 is array 一 基本使用 二 空数组 三 同时判断多
  • 字节对齐规则和位域

    字节对齐规则 结构体的起始存储位置必须是能够被该结构体中最大的数据类型所整除 每个数据成员存储的起始位置是自身大小的整数倍 比如int在32位机为4字节 则int型成员要从4的整数倍地址开始存储 结构体总大小 也就是sizeof的结果 必须
  • matlab 因果分析,matlab非参数的格兰杰因果分析

    代码1 deseason m function rp vp deseason data textdata days flipud textdata 1 days days 1 end 1 volume flipud data 5 price
  • Vue如何将数据显示在页面中

    如何将data的数据显示在页面中 1 文本插值 div msg div 渲染结果 div hello world div 2 原始HTML插值 v html v text 区别 v text不会对标签进行转义而v html会对标签进行一次转
  • QT笔记——初识QHostInfo、QHostAddress、QNetworkInterface

    网络模块需要在 pro文件中添加 QT network QHostInfo 利用操作系统提供的查询机制来查询与特定主机名相关联的主机的 IP 地址 头文件 include
  • Js中的defer属性和async属性

    Js中的defer属性和async属性 一 defer和async 1 defer 指外部js文件和当前html页面同时加载 异步加载 但只在当前页面解析完成之后执行js代码 async 指外部js文件和当前html页面同时加载 异步加载
  • Redhat Add and Remove Software[No Groups Available in any repository ]

    在 etc yum repos d中把rhel debuginfo repo 修改一下 enabled 1 修改为 enabled 1
  • Java 实现令牌桶限流算法 原生极简实现 包括单机和多线程版本

    文章目录 令牌桶算法简介 令牌桶算法限流范围 单机版实现 多线程版实现 令牌桶算法简介 令牌桶是指一个限流容器 容器有最大容量 每秒或每100ms产生一个令牌 具体取决于机器每秒处理的请求数 当容量中令牌数量达到最大容量时 令牌数量也不会改
  • Python中访问类中的私有变量的两种方法

    我们知道 类中的私有变量是不能直接在类外访问或修改的 因此我们可以设置一个get函数和一个set函数来间接访问和修改私有属性 那么每次访问和修改的都需要调用函数 有没有更简单的方法呢 下面介绍两种方法 1 property 属性函数 比如P
  • 如何保证数据产出质量简述

    如何保证数据产出质量简述 数据质量的评估 数据质量的保障 数据产出流程 机制 revire机制 数据质量保障中的工具 规则 SQLSCAN DQC 基线 数据质量的评估 数据质量可以从一下几个角度进行评估 完整性 完整性是指数据的记录和信息
  • ECG信号三大主要噪声-基线漂移,工频干扰,肌电干扰

    1 基线漂移 基线漂移属于 低频干扰 呼吸的节奏 四肢动作以及前端处理电路设计 都有可能造成基线漂移 致使原始ECG信号漂移之后的 幅度达到R波最大幅值的0 1 0 2倍 ECG信号的一般采用是 粘贴式或吸球式 电极来采集信号 那么存在于体
  • 请关闭该文件夹或文件,然后重试 怎么处理?

    一 打开任务管理器 性能 gt 打开资源监视器 选择CPU gt 搜索句柄中填入文件夹名称 右击结束进程 就能进行操作了
  • 【Linux入门教程】2 文件权限和访问模式、环境变量、管道和过滤器

    Linux文件权限和访问模式 为了更加安全的存储文件 Linux为不同的文件赋予了不同的权限 每个文件都拥有下面三种权限 所有者权限 文件所有者能够进行的操作 组权限 文件所属用户组能够进行的操作 外部权限 其他权限 其他用户可以进行的操作
  • QT编程之信号和槽机制知识

    qt知识总结 一 常见的父窗口有3类 1 QWidget 它是所有对象的基类 继承自QOject和OPaintDevice 2 QMainWindow 它提供了一个主要的应用窗口 可以用来构建APP的应用界面 3 QDialog 对话框 其