《Windows编程》微型技术报告二

针对信号和槽的专题研究

引言:信号(signal)和槽(slot)用于对象间的通讯。信号/槽机制是Qt的一个重要特征。 在图形用户界面编程中,常需要将一个窗口部件的变化通知给另一个窗口部件,或者说希望对象间进行通讯。一般的图形用户界面编程中采用回调函数进行对象间通信,这样回调和处理函数捆绑在一起,没有signal和slot机制的简便和灵活。

内容介绍:Qt的窗口部件有很多预定义的信号,slot是一个可以被调用处理特定信号的函数。Qt的窗口部件又很多预定义的槽,当一个特定事件发生的时候,一个信号被发射,对信号感兴趣的slot就会调用对应响应函数。信号/槽机制在QObject类中实现,从QObject类或者它的一个子类(比如QWidget类)继承的所有类可以包含信号和槽。当对象改变它们的状态的时候,信号被发送,对象不关心有没有其它对象接收到它所发射的信号。槽是类的正常成员函数。可以将信号和槽通过connect函数任意相连。当一个信号被发射它所连接的槽会被立即执行,就像一个普通函数调用一样。

一个带有信号和槽的Qt类Foo声明如下:

class Foo : public QObject

{

Q_OBJECT //包含信号和/或者槽的类必须声明Q_OBJECT

public:

Foo();

int value() const { return val; }

public slots:

void setValue( int ); //槽的声明

signals:

void valueChanged( int ); //信号声明

private:

int val;

};

void Foo::setValue( int v )

{

if ( v != val ) {

val = v;

emit valueChanged(v); //发送信号

}

}

下面把两个对象连接在一起:

Foo a, b;

connect(&a, SIGNAL(valueChanged(int)), &b, SLOT(setValue(int)));//信号与槽连接

b.setValue( 11 ); // a == undefined  b == 11

a.setValue( 79 ); // a == 79         b == 79

b.value();

调用a.setValue(79)会使a发射一个valueChanged() 信号,b将会在它的setValue()槽中接收这个信号,也就是b.setValue(79) 被调用。接下来b会发射同样的valueChanged()信号,但是因为没有槽被连接到b的valueChanged()信号,所以没有发生任何事(信号消失了)。

signals、slots和emit不是C++的标准关键字,需要预处理程序改变或者移去了signals、slots和emit 这些关键字,然后再使用标准的C++编译器。对包含有信号和槽的类定义运行MOC(Meta Object Compiler)。生成一个可以和其它对象文件编译和连接成引用程序的C++源文件。

槽是普通成员函数,它和普通成员函数一样分为public、protected和private三类,public slots表示声明的是任何信号都可以相连的槽。protected slots表示这个类的槽和它的子类的信号才能连接。private slots表示这个类本身的信号可以连接这个类的槽。

原文地址:https://www.cnblogs.com/gaoxiaoqiya666/p/9222333.html

时间: 2024-07-30 20:12:46

《Windows编程》微型技术报告二的相关文章

《Windows编程》微型技术报告一

   //Qt主窗口没有最小化,最大化按钮且最大化显示  int main(int argc, char *argv[])  {  QApplication a(argc, argv);  TestQtForWinCE w;  w.setWindowFlags(w.windowFlags()& ~Qt::WindowMaximizeButtonHint& ~Qt::WindowMinimizeButtonHint);  w.showMaximized();  return a.exec()

Win32 Windows编程 二

一.第一个窗口程序 1  入口函数 WinMain 2  窗口处理函数 LRESULT CALLBACK WndProc( HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam ) { return DefWindowProc( hWnd, nMsg, wParam, lParam ); } 当窗口处理消息事件时 调用该函数 LRESULT CALLBACK WndProc( HWND hWnd, UINT nMsg, WPARAM wParam,

Win32 Windows编程 十二

一.对话框 1.对话框的分类 2.对话框的基本使用方式 3.对话框资源 4.有模式对话框的使用 5. 无模式对话框的使用 5.1 添加对话框资源 5.2 定义窗口处理函数 BOOL CALLBACK DialogProc( HWND hWnd, UINT UMsg, WPARAM wParam, LPARAM lParam ) 5.3 创建对话框 HWND CreateDialog( HINSTANCE hInstance, // handle to module LPCTSTR lpTempl

【Windows编程】系列第十篇:文本插入符

大家知道,在使用微软的编程环境创建工程时会让你选择是控制台模式还是Windows应用程序.如果选择控制台的console模式,就会在运行时出现一个黑洞洞的字符模式窗口,里面就有等待输入一闪一闪的插入符.输入光标从DOS时代就存在,但是在Win32中赋予了更强大的功能.下图就是Windows的CMD窗口,其中的输入点就是插入光标: 要注意的是这里的插入符或插入光标并不是Windows中另外一个"光标",这里是指示插入字符的位置,而不是用于鼠标,手写输入等可以定位.移动的光标(Cursor

Java实验报告二:Java面向对象程序设计

Java实验报告二:Java面向对象程序设计                                                                                                      实验要求: 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L.I.D原则 5. 了解设计模式 实验内容 (一)单元测试 (二)面向对象三要素 (三)设计模式初步 (四)练习

Windows Server 2016技术预览

Windows Server 2016是微软将于2016年9月份发布的最新服务器操作系统.目前微软官方发布了许多Windows Server 2016新的功能和特性,下面我们来简单看下: 主要内容 预览版界面 系统需求及安装 服务器管理变化 新特性及变化 预览版界面 服务器界面,沉浸而不渲染 登录界面,色调变得活泼起来,用户图像由原先Windows2012的方块变成圆形 继续 进入系统,乍一看,以为是WIN10呢,注意右下角 如此做法,似乎在传递win10的最佳服务器系统就是他了 开始菜单,Al

【Windows编程】系列第八篇:通用对话框

上一篇我们学习了菜单的基本编程,本篇来了解一下通用对话框的使用.Windows系统之所以是目前最流行的桌面系统,也是因为Windows有一套标准化,统一友好的交互界面,比如菜单.工具栏.状态栏以及各个控件.当然除了这些单独的控件之外,对于像文件打开.保存对话框,字体对话,颜色对话框等对于Windows本身会用到,在很多第三方的应用程序中也会用到.因此微软公司也早就清楚这种现实情况会存在,所以Windows把这种常见的公共对话就做了统一的接口函数,供Windows自己和第三方开发者使用. Wind

【Windows编程】系列第九篇:剪贴板使用

 上一篇我们学习了常见的通用对话框,本篇来了解剪贴板的使用,它常用于复制粘贴功能. 剪贴板是Windows最早就加入的功能,由于该功能非常实用,我们几乎每天都会使用到.通过剪贴板,我们就可以将数据从一个应用程序传递到另一个应用程序,是一种简单的进程间通信. 许多文档处理软件都有复制.剪切.粘贴功能,这些都是用Windows剪贴板实现的,当然我们也可以在我们的程序中实现自己的剪贴板功能,本篇我们就来实现自己的剪贴板.使用剪贴板时,都是先把源数据先传到剪贴板上,再在需要的时候从剪贴板传输到目的处

Windows Workflow Foundation技术介绍(基于.NET Framework 4.5)

Windows Workflow Foundation技术介绍(基于.NET Framework 4.5) 转自:http://www.cpiso.cn/jsyj/ghxx/2014/5/15/459.shtml Microsoft Windows Workflow Foundation (WF) 是一个可扩展框架,用于在 Windows 平台上开发工作流解决方案.Windows Workflow Foundation 同时提供了 API 和一些工具,用于开发和执行基于工作流的应用程序.Wind