1. Qt消息模型

(1)Qt封装了具体操作系统的消息机制

(2)Qt遵循经典的GUI消息驱动事件模型

2. 信号与槽

(1)Qt中定义了与系统消息相关的概念

  ①信号(Signal):由操作系统产生的消息

  ②槽(Slot):程序中的消息处理函数

  ③连接(Connect):将系统消息绑定到消息处理函数(映射规则)

(2)Qt中的消息处理机制

(3)Qt的核心——QObject::connect函数

  ①函数原型

bool connect(const QObject* sender,     //发送对象
const char* signal, //消息名
const QObject* receiver, //接收对象
const char* method, //接收者成员函数(消息处理函数)
Qt::ConnectionType type = Qt::AutoConnection);

  ②在Qt中,消息用字符串进行描述,method是成员函数的名字(也是字符串类型)

  ③connect函数在消息名和处理函数之间建立映射

(4)Qt中的“新”关键字

  ①SIGNAL:用于指定消息名

  ②SLOT:用于指定消息处理函数名

  ③Q_OBJECT:所有自定义槽的类必须在类声明的开始处加上Q_OBJECT

  ④slots:用于在类中声明消息处理函数

【编程实验】初探信号和槽

#include <QApplication>
#include <QPushButton> int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QPushButton b; //顶级组件 b.setText("Click me to quit!");
b.show(); //将按钮b的clicked消息映射到a的quit函数
QObject::connect(&b, SIGNAL(clicked()), &a, SLOT(quit())); return a.exec();
}

3. 自定义槽

(1)只有QObject的子类才能自定义槽

(2)定义槽的类必须在声明的最开始处使用Q_OBJECT

(3)类中声明槽时需要使用slots关键字

(4)与所处理的信号在函数签名上必须一致(函数签名,即相同参数及类型、返回值

(5)SIGNAL和SLOT所指定的名称中,可以包含参数类型,但不能包含具体的参数名

【编程实验】为计算器实例添加消息处理函数

//main.cpp

#include <QApplication>
#include "QCalculatorUI.h" int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QCalculatorUI* cal = QCalculatorUI::NewInstance();
int ret = -; if(cal != NULL)
{
cal->show();
ret = a.exec(); delete cal;
} return ret;
}

//QCalculatorUI.h

#ifndef _QCALCULATORUI_H_
#define _QCALCULATORUI_H_ #include <QWidget>
#include <QLineEdit>
#include <QPushButton> class QCalculatorUI : public QWidget
{
//要自定义信号和槽,必须在最开始的这里添加Q_OBJECT
Q_OBJECT
private:
QLineEdit* m_edit;
QPushButton* m_buttons[]; //二阶构造法:当new一个QLineEdit和一些按钮时可能会失败,所以采用二阶构造
QCalculatorUI(); //第1阶——先隐藏构造函数
bool construct();//第2阶 private slots: //声明槽时得加slots
void onButtonClicked(); public:
static QCalculatorUI* NewInstance();
void show();
~QCalculatorUI();
}; #endif //_QCALCULATORUI_H_

//QCalculatorUI.cpp

#include "QCalculatorUI.h"
#include <QDebug> QCalculatorUI::QCalculatorUI(): QWidget(NULL, Qt::WindowCloseButtonHint)
{ } bool QCalculatorUI::construct()
{
bool ret = true; const char* btnText[] =
{
"", "", "", "+", "(",
"", "", "", "-", ")",
"", "", "", "*", "←",
"", ".", "=", "/", "C",
}; m_edit = new QLineEdit(this);//le的生命期由父组件来管理
if( m_edit != NULL)
{
m_edit->move(, );
m_edit->resize(, );
m_edit->setReadOnly(true); //设置编辑框的只读属性
}
else
{
ret = false;
return ret;
} for(int i = ; (i < ) && ret; i++)
{
for(int j = ; (j< ) && ret; j++)
{ m_buttons[i * + j] = new QPushButton(this);//按钮的生命期由父组件来管理
if (m_buttons[i * + j] != NULL)
{
m_buttons[i * + j]->resize(, );
m_buttons[i * + j]->move( + j * , + i * );
m_buttons[i * + j]->setText(btnText[i * + j]); //消息映射
//1.消息名(信号)要加SIGNAL关键字,消息处理函数(槽):用SLOT关键字
//2.信号和槽的函数签名必须一致,即都是无参的函数,返回值void
connect(m_buttons[i*+j], SIGNAL(clicked()), this, SLOT(onButtonClicked()));
}
else
{
ret = false;
}
}
} return ret;
} QCalculatorUI* QCalculatorUI::NewInstance()
{
QCalculatorUI* ret = new QCalculatorUI(); if((ret == NULL) || !ret->construct())
{
delete ret;//删除半成品
ret = NULL;
} return ret;
} void QCalculatorUI::show()
{
QWidget::show();
setFixedSize(width(), height());
} void QCalculatorUI::onButtonClicked()
{
//sender是QObject类的,用于表示消息的发送者
QPushButton* btn = (QPushButton*)sender(); qDebug() << "onButtonClicked()";
qDebug() << btn->text(); } QCalculatorUI::~QCalculatorUI()
{ }

(6)小贴士:解决经典问题——Object::connect:No such slot…

  ①检查类是否继承于QObject

  ②检查类声明的开始处是否添加Q_OBJECT

  ③检查是否使用slots关键字进行槽声明

  ④检查槽的名称是否拼写错误

  ⑤重新执行qmake

4. 小结

(1)信号与槽是Qt中的核心机制

(2)不同的Qt对象可以通过信号和槽进行通信

(3)只有QObject的子类才能自定义信号和槽

(4)使用信号和槽的类必须在声明的最开始处使用Q_OBJECT

(5)信号与处理函数在函数签名上必须一致。

第10课 初探 Qt 中的消息处理的更多相关文章

  1. 第38课 Qt中的事件处理(上)

    1. GUI程序原理回顾 (1)图形界面应用程序的消息处理模型 (2)思考:操作系统发送的消息如何转变为Qt信号 2. Qt中的事件处理 (1)Qt平台将系统产生的消息转换为Qt事件 ①Qt事件是一个 ...

  2. 第30课 Qt中的文本编辑组件

    1. 3种常用的文本编辑组件的比较 单行文本支持 多行文本支持 自定义格式支持 富文本支持 QLineEdit (单行文本编辑组件) Yes No No No QPlainTextEdit (多行普通 ...

  3. 第11课 Qt中的字符串类

    1. 历史遗留问题和解决方案 (1)历史遗留问题 ①C语言不支持真正意义上的字符串 ②C语言用字符数组和一组函数实现字符串操作 ③C语言不支持自定义类型,因此无法获得字符串类型 (2)解决方案 ①从C ...

  4. 第7课 Qt中的坐标系统

    1. 坐标系统 (1)GUI操作系统都有特定的坐标系统 (2)图形界面程序在坐标系统中进行窗口和部件的定位 (3)定位类型 ①顶级窗口部件的定位 ②窗口内部件的定位 ③窗口部件的大小设置 (4)QWi ...

  5. 第47课 Qt中的调色板

    1. QPalette类 (1)QPalette类提供了绘制QWidget组件的不同状态所使用的颜色. (2)QPalette对象包含了3个状态的颜色描述 ①激活颜色组(Active):组件获得焦点使 ...

  6. 第39课 Qt中的事件处理(下)

    1. 事件的传递过程 (1)操作系统检测到用户动作时,会产生一条系统消息,该消息被发送到Qt应用程序 (2)Qt应用程序收到系统消息后,将其转化为一个对应的QEvent事件对象,并调用QObject: ...

  7. 第32课 Qt中的文件操作

    1. Qt的中IO操作 (1)Qt中IO操作的处理方式 ①Qt通过统一的接口简化了文件和外部设备的操作方式 ②Qt中的文件被看作一种特殊的外部设备 ③Qt中的文件操作与外部设备的操作相同 (2)IO操 ...

  8. 信号和槽:Qt中最差劲的创造

    不要被这个标题唬住了,实际上我是非常认可Qt的.在C++实现的开源产品中没有哪一个的API风格比得上Qt,拥有高度一致性,符合常识,符合直觉,几乎不用学就可以直接上手.或许是由于我们摆脱不了马太效应的 ...

  9. Qt中 QString 和int, char等的“相互”转换

    转载:http://blog.csdn.net/ei__nino/article/details/7297791 Qt中 int ,float ,double转换为QString 有两种方法 1.使用 ...

随机推荐

  1. vue双向数据绑定最最最最最简单直观的例子

    vue双向数据绑定最最最最最简单直观的例子 一.总结 一句话总结:双向绑定既不仅model可以影响view的数据,view也可以影响model的数据 view model 数据 1.vue双向数据绑定 ...

  2. Spring4 MVC RESTFul WebServices CRUD实例+RestTemplate

    简单介绍REST REST 表示状态传输.这是一个体系结构样式,可用于设计网络服务,可以被各种客户端消耗.核心思想是,不使用如CORBA,RPC或SOAP复杂的机制在机器之间进行连接,简单的 HTTP ...

  3. Android Studio之高德地图实现定位和3D地图显示

    在应用开发中,地图开发是经常需要使用的“组件”,国内比较出名的是就是百度地图和高德地图. 此博客讲的是高德地图实现定位和3D地图显示,并标注相应位置,话不多说,先看看效果,在上代码. 效果如图: 首先 ...

  4. POJ 1426 Find the Multiple 思路,线性同余,搜索 难度:2

    http://poj.org/problem?id=1426 测试了一番,从1-200的所有值都有long long下的解,所以可以直接用long long 存储 从1出发,每次向10*s和10*s+ ...

  5. SGU 219 Synchrograph tarjian找环,理解题意,图论 难度:3

    http://acm.sgu.ru/problem.php?contest=0&problem=219 题目大意: 如果指向某个点的边权全都为正数,那么这个点就是可点燃的,点燃操作把入弧权值- ...

  6. 《Agile Web Development With Rails》读后感--rails基于web设计的best Practices

    最近看完<Agile Web Development with Rails>一书,受益匪浅.书中先是用一个简单的web应用带你进入Rails的世界,然后在你大致熟悉之后,再带你了解Rail ...

  7. L201

    The American public’s obsession with dieting has led to one of the most dangerous healthmisconceptio ...

  8. Centos 7 系统详解

      安装CentOS 7系统后,变化竟然这么大? 一.Runlevel首先一条,原来一直用的CentOS-6.5-x86_64-minimal.iso光盘镜像(400M左右无图形系统小巧便捷),而7目 ...

  9. Qt Creator 模块QtSql

    在新建Qt Gui Application时,没有弹出模块选择页, 可以手动在pro文件中增加. 比如要选中QtSql模块,(目前我没有找到哪里可以修改要选中的模块), 我是手动在pro文件中增加了一 ...

  10. Python中的变量和常量

    本文主要介绍Python中的变量和常量,包括变量的命名规范,使用注意事项 -------------- 完美的分割线 --------------- 1.变量 1.1.变量理解 1)什么是变量 变量即 ...