当前位置: 首页 > news >正文

广州网站建设阿里云室内设计说明500字简约

广州网站建设阿里云,室内设计说明500字简约,为解析的域名做网站,WORDPRESS摘要无效目录 关于信号 connect函数 关于connect connect的使用 自定义信号、自定义槽 自定义槽 第一种方式自定义槽 第二种方式自定义槽 自定义信号 信号槽 带参数的信号槽 参数个数一致的示例 参数个数不一致的示例 Q_OBJECT 信号和槽存在的意义 disconnect函数 使用…目录 关于信号 connect函数 关于connect connect的使用 自定义信号、自定义槽 自定义槽 第一种方式自定义槽 第二种方式自定义槽 自定义信号 信号槽 带参数的信号槽 参数个数一致的示例 参数个数不一致的示例 Q_OBJECT 信号和槽存在的意义 disconnect函数 使用lambda表达式定义槽函数 关于信号 关于信号在 Linux 中也学过信号的概念Qt中的信号与 Linux 中的信号是不同的概念但是也是有相似之处的 Qt 中,谈到信号,也是涉及到三个要素 ①信号源 由哪个控件发出的信号 ②信号的类型 用户进行不同的操作,就可能触发不同的信号例如 点击按钮触发点击信号 在输入框中移动光标,触发移动光标的信号 勾选一个复选框、选择一个下拉框都会触发出不同的信号 ③信号的处理方式 槽(slot) 函数 Qt 中可以使用 connect 这样的函数把 一个信号和一个槽 关联起来后续只要信号触发了Qt 就会自动的执行槽函数 所谓的槽函数本质上也是一种回调函数(callback) Qt 中一定是先关联好 信号和槽然后再触发这个信号顺序不能颠倒否则信号就不知道如何处理了 connect函数 这个函数和 Linux TCP socket 中建立连接的函数没有任何关系只是名字恰巧一样 关于connect connect函数是 QObject 提供的静态的成员函数Qt 中提供的这些类本身是存在一定的继承关系的 QObject 就是其他 Qt 内置类的 祖宗 正是因为 connect函数 是 QObject 提供的而其他的类都是继承自 QObject 的所以其他的类也可以使用 connect函数 connect的使用 connect函数的声明 connect (const QObject *sender, const char * signal ,const QObject * receiver , const char * method , Qt::ConnectionType type Qt::AutoConnection )上述的 connect函数 总共有5个参数但是第5个参数提供了一个默认参数所以我们可以暂时不考虑大部分情况下使用的前面4个参数 参数1 sender描述了当前信号是哪个控件发出来的 参数2 signal发送的信号类型 参数3 receiver哪个对象(控件)负责处理这个信号 参数4 method这个对象怎么处理(要处理信号的对象提供的成员函数槽函数) 下面是简单的示例界面上包含一个按钮用户点击按钮则关闭窗口在使用QPushButton时传入第二个参数时有两个提示一个是click另一个是 clickedclick是一个 slot 函数作用就是在调用的时候相当于点击了一下按钮clicked是过去分词形式表示点完了才会触发点击信号 我们使用的是clicked表示点击按钮再触发点击信号 connect 要求第一个和第二个参数是匹配的button 的类型如果是 QPushButton* 那么第二个参数的信号必须是 QPushButton 内置的信号(或是QPushButton 父类的信号)不能是一个其他的类比如 QLineEdit 的信号 close 是 QWidget 内置的槽函数Widget 继承自 QWidget也就继承了父亲的槽函数 close 槽函数功能已经是人家内部实现好了不需要咱们去关心 close 槽函数具体的作用就是关闭当前的窗口/控件 widget.cpp实现如下 此时运行项目 此时点击这个按钮就会关闭窗口了 我们是怎么得知QPushButton中有clicked函数Widget中有close函数的 很简单查看文档即可如果在当前类中没有找到那就在当前类的父类中寻找 还有一个问题下面是我们在代码中使用的connect函数 connect(button, QPushButton::clicked, this, Widget::close); 但是我们看connect的函数声明中前4个参数的类型如下 connect (const QObject *sender, const char * signal ,const QObject * receiver , const char * method )其中第一个和第三个类型是 QObject* 的我们传入的 button 和 this 都是 QObject 的子类的指针能够理解 但是第二个和第四个参数声明中是 char* 的但是我们传入的是 QPushButton::clicked 和  Widget::close这两个是函数指针并不是 char* 类型这是为什么呢 其实这个函数声明是以前版本的 Qt 的 connect 函数的声明以前版本中传参的写法和现在其实也是有区别的以前的版本中 给信号参数传参时要搭配一个 SIGNAL 宏 给槽参数传参搭配一个 SLOT 宏也就是下面的这种形式 connect(button, SIGNAL(QPushButton::clicked), this, SLOT(Widget::close)); 从 Qt 5 开始对上述写法做出了简化不再需要写 SIGNAL 和 SLOT 宏了 给 connect 提供了重载版本重载版本中第二个参数和第四个参数成了 泛型参数允许传入任意类型的函数指针 此时 connect 函数就带有了一定的 参数检査 功能 如果传入的第一个参数和第二个参数不匹配或者第三个参数和第四个参数不匹配此时代码编译出错不匹配指的是2/4 参数的函数指针不是 1/3 参数的成员函数 自定义信号、自定义槽 在刚刚使用 connect函数 时传入的 clicked 和 close 都是 Qt 内置的但是内置的信号和槽不一定可以满足我们的要求所以我们需要自定义信号和自定义槽 自定义槽 slot(槽) 其实就是一个普通的成员函数 自定义一个槽函数操作过程和自定义一个普通的成员函数没啥区别 下面实现一个自定义的槽函数在点击按钮后就执行我们自己实现的槽函数 handleCilcked 在以前的 Qt 的旧版本中自定义槽函数必须要写在 private/protected/public slots: 下面后面的新版本就不需要这样了slots 是 Qt 自己扩展出来的关键字 第一种方式自定义槽 widget.h 中声明 widget.cpp 中定义 此时运行程序 点击按钮 第二种方式自定义槽 使用图形化界面的方式先将按钮拖到界面上 右键按钮点击转到槽 这个窗口会列出 QPushButton 中给我们提供的所有的信号 还包含了 QPushButton 父类的信号 QPushButton 继承自 QAbstractButton QAbstractButton 继承自 QWidget QWidget 继承自 QObject 所以下面将这几个父类的信号都列举出来了 选择 clicked再点击OK此时在 widget.h 和 widget.cpp 中就有了声明和定义此时在该函数的内部编写函数的代码即可 依旧是实现刚刚的功能 此时运行程序 点击按钮 我们发现上述的第二种方式并没有使用 connect函数 在 Qt 中除了通过 connect 来连接信号和槽之外还可以通过函数名字的方式来自动连接 当函数名符合上述规则之后Qt 就能自动的把信号和槽给建立上联系 Qt 中调用 connectSlotByName函数 的时候就会触发上述自动连接信号槽的规则 connectSlotByName函数 正是在自动生成的 ui widget.h 中调用的 如果我们通过图形化界面创建控件还是推荐使用这种快速的方式来连接信号槽 如果我们是通过代码的方式来创建控件还是得手动 connect因为你的代码中没有调用 connectSlotsByName函数 自定义信号 Qt 中也允许自定义信号 自定义槽函数是非常关键的开发中大部分情况都是需要自定义槽函数的 槽函数就是用户触发某个操作之后要进行的业务逻辑 自定义信号比较少见实际开发中很少会需要自定义信号信号就对应到用户的某个操作 在 GUI 中用户能够进行哪些操作是可以穷举的 Qt 内置的信号基本上已经覆盖到了上述所有可能的用户操作 因此使用 Qt 内置的信号就足以应付大部分的开发场景了 所以这里的自定义信号只需简单了解即可 信号是一类非常特殊的函数 程序员只要写出函数声明并且告诉 Qt这是一个信号即可 这个函数的定义是 Qt 在编译过程中自动生成的 自动生成的过程, 程序员无法干预原因是 信号在 Qt 中是特殊的机制Qt 生成的信号函数的实现要配合 Qt 框架做很多既定的操作 作为信号函数这个函数的返回值必须是 void 有没有参数都可以甚至也可以支持重载 signals 也是 Qt 自己扩展出来的关键字 qmake 的时候调用一些代码的分析/生成工具扫描到类中包含 signaks 这个关键字的时候就会自动的把下面的函数声明认为是信号并且给这些信号函数自动的生成函数定义 所以我们先在 widget.h 中声明自定义的信号函数 mySignal和自定义槽函数 handleClicked widget.cpp中 此时运行发现窗口的标题并没有任何的改变是因为我们这里只是使用 connect 建立连接了并没有发出信号 如何才能触发出自定义的信号呢? Qt 内置的信号都不需要我们手动通过代码来触发用户在 GUI 进行某些操作时就会自动触发对应信号例如 clicked 操作就是 点击按钮 后触发(发射信号的代码已经内置到 Qt 框架中了) 自定义类型的信号就需要关键字 emit(发射) 信号函数就可以触发自定义的信号了 所以新增一行代码 运行结果 也就是当我们启动程序后窗口启动好以后信号就发送出来了下面的槽函数就会进行触发 我们也可以不选择在构造函数中发送信号可以选择点击按钮时再发送信号所以采用 图形化 的方式拖动一个按钮到界面上再右键点击 转到槽 点击 clicked再点击 OK 这里将发送信号的代码写到 on_pushButton_clicked函数 中 此时运行程序 点击 发送信号 按钮 下面梳理一下代码的逻辑 点击按钮相当于按钮发送了一个 clicked 信号 clicked 信号关联到 on_pushButton_clicked槽函数 on_pushButton_clicked槽函数 执行又发送了 mySignal信号 mySignal信号 又会关联到 handleClicked槽函数 所以就会执行 handleClicked槽函数 中改变窗口标题的设置 其实在 Qt 5 中 emit 现在啥都没做真正的操作都包含在 mySignal 内部生成的函数定义了 所以即使不写 emit信号也能发送出去但是还是建议加上 emit可读性更强能更明显的表示出什么地方是发射自定义信号 emit除了发射自定义信号Qt内置的信号也能借助 emit 发射出来 信号槽 带参数的信号槽 我们刚刚所写的 信号和槽函数 都是没有参数的但是 信号和槽函数 其实也是可以带参数的 当信号带有参数的时候槽的参数必须和信号的参数一致类型必须一致参数个数可以不一致 此时发射信号的时候就可以给信号函数传递实参与之对应的这个参数就会被传递到对应的槽函数中此时就可以起到让信号给槽传参的效果 参数个数一致的示例 我们将 widget.h 中自定义的 信号和槽函数 都加上一个相同的参数 widget.cpp 中 在发送信号时信号中带的实参就会被传递到槽函数对应的形参中这样就完成了通过信号给槽传参的效果 此时运行程序 点击按钮 传参可以起到复用代码的效果 有多个逻辑逻辑上整体一致但是涉及到的数据不同就可以通过函数-参数来复用代码并且在不同的场景中传入不同的参数即可 如下所示使用 图形化 的方式创建两个按钮并分别右键点击 转到槽 这两个槽函数分别传入 发送文本1 和 发送文本2 这两个信息 运行程序 点击第一个按钮 点击第二个按钮 此时就可以通过这一套信号槽搭配不同的参数就可以起到设置不同标题的效果 参数个数不一致的示例 此时在 widget.h 中将信号参数多加一个槽的参数保持不变 在 widget.cpp 中给信号传参时也加上第二个参数 此时虽然槽函数只有一个参数但是不影响程序的正确运行和上述执行的情况是一样的 信号函数的参数个数超过了槽函数的参数个数此时都是可以正常使用的 信号函数的参数个数少于槽函数的参数个数此时代码无法编译通过 为什么不要求信号的参数个数和槽的参数个数严格一致此处为什么允许信号的参数比槽的参数多呢? 因为一个槽函数有可能会绑定多个信号 如果我们严格要求参数个数一致就意味着信号绑定到槽的要求就变高了换而言之 当下这样的规则就允许信号和槽之间的绑定更灵活了更多的信号可以绑定到这个槽函数上了 当个数不一致时槽函数就会按照参数顺序拿到信号的前 N 个参数 至少需要确保槽函数的每个参数都是有值的 所以要求信号给槽的参数可以有富裕但是不能少 Q_OBJECT Qt 中如果要让某个类能够使用信号槽也就是可以在类中定义信号和槽函数则必须要在类最开始的地方写下 Q_OBJECT宏 这个宏能展开成很多额外的代码Alt 鼠标左键点开 Q_OBJECT 可以看到包含了这么多代码并且这些代码还有大量的宏定义所以还可以进一步展开会得到一系列很复杂的代码这些代码就涉及到 Qt 实现的内部原理了(此处就不去深入研究了) 例如在上述实现的代码中查看 widget.h 可以看到在最开始的地方就有 Q_OBJECT 这个宏如果我们将这个宏注释掉就会报错 此时这个错误就明确说了这个类缺少了 Q_OBJECT 这个宏 信号和槽存在的意义 所谓的信号槽终究要解决的问题就是响应用户的操作 而其他 GUI例如前端页面在响应用户操作时每一个用户的操作都对应一个处理函数不需要搞一个 单独的 connect 完成上述的信号槽连接 Qt 信号槽connect 这个机制设想很美好的 解耦合. 把触发 用户操作的控件 和 处理对应用户的操作逻辑 解耦合 多对多效果 一个信号, 可以 connect 到多个槽函数上 一个槽函数,也可以被多个信号 connect 所以前端开发的机制是完成一对一的 一个事件只能对应一个处理函数一个处理函数也只能对应到一个事件上 而 Qt 的机制所期望的效果是完成多对多的多对多这个概念在数据库中也是经常遇到的 如下所示创建三个信号函数和三个槽函数 此时就可以在 widget.cpp 中进行多对多的connect了 综上所述Qt 引入信号槽机制最本质的目的就是为了能够让信号和槽之间按照 多对多 的方式来进行关联 其他的 GUI框架往往也不具备这样的特性 实际上随着程序开发这个事情大家经验越来越多其实在 GUI 开发的过程中多对多这件事其实是个伪需求 实际开发很少会用到绝大部分情况一对一就够用了 disconnect函数 使用 disconnect 来断开信号槽的连接disconnect 使用的方式和 connect 是非常类似的 disconnect用的比较少大部分的情况下把信号和槽连上了之后就不必管了 主动断开往往是把信号重新绑定到另一个槽函数上 下面先创建一个按钮 并绑定自定义的槽函数(采用connect的方式) 此时再创建第二个按钮使用右键点击转到槽的方式连接信号和槽 第二个按钮中会先断开 pushButton 原来的信号槽再重新绑定信号槽 并且在两个槽函数 handleClick 和 handleClick2 中都加入了日志信息 qDebug()可以清楚看到发出信号后是否调用了槽函数 运行程序 点击第一个按钮表示调用了 handleClick函数 再点击第二个按钮后点击第一个按钮表示只调用了 handleClick2函数 如果将这里的 disconnect 注释掉此时 clicked 这个信号就会同时绑定两个 槽函数 此时先点击第一个按钮 点击完第二个按钮后再点击第一个按钮 观察结果可以看到如果没有 disconnect就会构成一个信号绑定了两个槽函数。触发信号的时候两个槽函数都会执行 所以就证明了 Qt 的信号槽是支持多对多的如果只是重新connect那么新的槽函数不会去替换原来的槽函数除非 手动 disconnect 才会解除原来绑定的关系 使用lambda表达式定义槽函数 lambda表达式本质就是一个匿名函数主要应用在回调函数场景中是一次性使用的 运行程序 点击按钮 此时就完成了功能使用 lambda表达式相比于前面自定义槽函数需要声明和定义更为简便 后续如果我们对应的槽函数比较简单而且是一次性使用的就经常会写作这种 lambda 的形式 lambda 语法是 C 11 中引入的对于 Qt 5 及其更高版本默认就是按照 C 11 来编译的 如果使用 Qt 4 或者更老的版本就需要手动在 .pro 文件中加上 C11 的编译选项 下面是当前版本的 .pro 文件中关于 C11 的编译选项 信号槽相关知识到此结束
http://www.w-s-a.com/news/968730/

相关文章:

  • 以下属于网站的管理 更新 维护如何才能做好品牌网站建设
  • 国家工业和信息化部网站备案系统网站建设设计费用
  • 网站建设利弊宁波高端网站建设联系方式
  • 网站订票策划方案郑州代做网站
  • 免费的网站加速器注册公司邮箱
  • 千助网站建设网站整站程序
  • 自学建网站做网站优化访问网站出现目录
  • 济南网站建设是什么百度官网登录入口手机版
  • net快速建站西宁手机网站建设
  • 网站浏览器不兼容怎么办软件系统开发大概多少钱
  • 网站建设哪个公司最好shift wordpress
  • 公司网站建设功能介绍室内设计学习
  • 做网站策划容易遇到哪些问题沈阳公司网站制作
  • 做php网站都用框架吗网站备案当面核验拍摄照片
  • 泉州企业自助建站兰州最好的互联网公司
  • 监察部门网站建设方案网站seo技术教程
  • 个人网站制作源代码下载品牌建设部
  • 网站备案需要准备什么文创产品设计思路
  • 网站开发书籍推荐青岛城阳新闻最新消息
  • 秦皇岛网站建设服务聊城做网站的公司资讯
  • 30岁转行做网站设计丰涵网站建设
  • 山东省和住房建设厅网站首页开发商不按时交房可以退房吗
  • asp网站怎么做404页面跳转本地南通网站建设
  • 点击网站出现微信二维码的链接怎么做申请网站空间怎么做
  • 网站开发的论文题目广告设计排行榜
  • 网络营销网站 功能南京h5制作公司
  • 做网站的费用的会计分录合肥做网站推广哪家好
  • 电子商城网站开发怎么wordpress用的什么主题
  • 榆林电商网站建设网上做试卷的网站
  • 文山网站建设代理中公教育培训机构官网