2-qt之信号与槽-简单实例讲解

前言、因实践课程讲解需求,简单介绍下qt的信号与槽。

一、了解信号与槽

怎样使用信号与槽?

概览

还记得 X-Window 上老旧的回调函数系统吗?通常它不是类型安全的并且很复杂。(使用)它(会)有很多的问题。Qt提供了一种新的事件处理系统-信号-槽。想象一下闹钟(工作的样子)。当闹铃响的时候,它正在发出信号(发射)。而你处理这个事件的过程就类似使用一个槽的样子。

  • 每个QObject类(或其派生类)的对象都可以含有你能想象到的一样多的信号和槽
  • 只有定义过这个信号的类或者其派生类能够发射这个信号
  • 可以把一个槽与另一个槽连接起来(做成信号链)
  • 每个信号与槽之间可以有无限制数量的连接
  • 注意: 不能为槽的参数设置缺省值。例如以下代码是错误的:

void mySlot(int i = 0);

信号与槽的连接

可以使用下面的模板(原型)连接信号和槽:

QObject::connect ( const QObject * sender, const char * signal, const QObject * receiver, const char * method);

必须把上式中的const char * signal和const char * method分别放进SIGNAL() 和SLOT() 这两个宏里面。

可以像下面那样解除信号和槽的连接:

QObject::disconnect ( const QObject * sender, const char * signal, const QObject * receiver, const char * method);

进一步探讨

当事件发生时,某个部件(或对象)就会发射信号。比如,当一个按钮部件被点击时,它就会发出"被点击"这个信号。开发者可以选择创建一个函数(没错,它就是一个"槽"),并使用

connect()

来把这个信号与槽关联起来。Qt的信号与槽机制(被设计成)并不要求这些相关的类互相了解,这就使得开发高度可重用的类变得更容易。由于信号与槽是类型安全的,类型错误会以警告的方式(被编译器)报告出来并且不会引起(程序)崩溃。 举例来说,假如一个Quit按钮的

clicked()

信号与应用程序的

quit()

槽相连接,那么当用户点击该Quit按钮时,就会终止这个程序的运行。用代码实现该连接如下:

connect(button, SIGNAL (clicked()), qApp, SLOT (quit()));

在应用程序运行期间的任何时候,信号与槽的连接都可以被添加或移除。它们可以在信号被立即或者安排到以后去发射时建立起来,而且可以用于不同对象间的多线程应用中。

信号与槽机制是使用标准C+实现的。它使用了C中的预处理器以及Qt中的

moc, 即元对象编译器( Meta-Object Compiler)。代码的生成由Qt的构建系统(Qt's-Build-System)自动完成。开发者几乎不需要浏览或者编辑这些代码。

除了完成信号与槽的处理,元对象编译器还对Qt的多语言机制、属性系统以及扩展的运行时类型识别提供了支持。它还为C+程序的运行时内省在所有支持的平台上的运行提供了一种途径。

二、实例讲解

三、实例代码:

 .pro文件

QT +=widgets

CONFIG += c++11

SOURCES += \

main.cpp

/****************************************

* 项目名:2_14

* 说  明:连接信号与槽

****************************************/

#include<QApplication>

#include<QWidget>

#include<QPushButton>

#include<QLineEdit>

#include<QSignalMapper>

int main(int argc,char* argv[])

{

    QApplication a(argc,argv);

    QWidget w;

    QLineEdit lineEdit(&w);

    QPushButton btn1(&w),btn2(&w),btn3(&w);

    w.resize(200,200);      //设置窗口和各部件的大小、位置,显示的文本等

    lineEdit.move(10,10);

    btn1.move(10,40);

    btn2.move(10,70);

    btn3.move(10,100);

    lineEdit.setText("我是21级电信专业的");

    btn1.setText("清除");

    btn2.setText("设置一段文字");

    btn3.setText("关闭窗口");

    //信号槽连接

    QObject::connect(&btn1,SIGNAL(clicked()),&lineEdit,SLOT(clear()));

    QObject::connect(&btn3,SIGNAL(clicked()),&w,SLOT(close()));

    //通过QSignalMapper把无参clicked信号翻译成带QString参数的信号

    QSignalMapper mapper;

    QObject::connect(&btn2, SIGNAL(clicked()), &mapper, SLOT(map()));

    mapper.setMapping(&btn2, "我是1a班");

    QObject::connect(&mapper, SIGNAL(mapped(const QString&)),&lineEdit, SLOT(setText(const QString&)));

    //使用lamda表达式解决

    //QObject::connect(&btn2,&QPushButton::clicked,&lineEdit,[&]{lineEdit.setText("我是一行文字");});

    w.show();

    return a.exec();

}

运行界面效果:

<<main.cpp>>

<<2_14.pro.user>>

  • 13
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 黑马qt公开课是一套为期5天的课件,主要介绍了Qt框架的基础知识和应用。Qt框架是一个跨平台的开发工具,可以方便地进行应用程序的设计、开发和调试,被广泛应用于图形界面开发、嵌入式系统和移动应用等领域。 在5天的课程中,学习者将对Qt框架的整体架构有一个全面的认识,包括Qt及其常用库的概念、功能和用法,也学会了如何使用Qt Designer进行界面设计和基于信号的事件编程。 此外,课程还将介绍Qt中常用的编程模式和技术,如MVC架构、文件操作、网络编程等,并通过实例让学习者深入理解和应用这些概念和技术。 5天的课件中还提供了大量的实践操作,让学习者通过编写实际案例,深入理解所学知识,并更好地掌握Qt框架的基础和应用,为以后的工作打下坚实的基础。 总之,如果你想快速入门Qt框架的基础知识和应用,那么黑马qt公开课—5天的课件,将是一个非常好的选择。 ### 回答2: 黑马qt公开课的课件共分为5天,内容涵盖了Qt的基础知识、UI设计、绘图系统、多线程编程和网络编程等方面。通过这5天的学习,学员可以全面掌握Qt的开发技能和应用场景,具备开发Qt应用程序的能力。 第一天课程主要介绍了Qt的基础知识,包括Qt窗口和控件、信号机制、事件处理、布局和样式等内容。通过这些基础知识的学习,学员可以了解Qt的基本工作原理和操作方法。 第二天的课程主要讲解Qt的UI设计,包括UI设计器的使用、自定义控件和样式等内容。学员可以从中学习到如何设计美观、直观的用户界面。 第三天的课程则主题为Qt的绘图系统,包括2D和3D绘图、动画效果和图形转换等内容。在这一天的课程中,学员可以学习到如何使用Qt进行图形绘制和界面效果的优化。 第四天的课程主要介绍了Qt的多线程编程,包括线程的创建和管理、互斥锁和信号量等内容。学员可以从中学习到如何在Qt中实现多线程应用程序。 第五天的课程则主题为Qt的网络编程,包括socket编程、HTTP协议和Web服务等内容。学员可以从中学习到如何使用Qt进行网络编程,实现客户端和服务器的互通。 总体来说,黑马qt公开课的5天课程涵盖了Qt的核心知识点,让学员能够全面掌握Qt的开发技能和应用场景。通过这些课程的学习,学员可以成为一名合格的Qt开发工程师。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个在高校打杂的

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值