QT库结构

  Qt图形库是一个组织严谨的C++类库,其结构如图所示


细说Qt库

  Qt类库中包含了上百个类,结构十分复杂,上图展示了Qt_3.2类库的基本结构。

  Qt类库中的类可以分成两种类型:

    • 一种是直接或者继承自Qt类

    • 另一种是独立的,不从任何类集成

  独立的类在Qt库中一般用来完成独立的功能,例如操作XML文件的QXmlReader类。

  直接从从Qt类继承的类主要可以分成QObject类和QEvent类。QObject类是所有应用组件的基类,QEvent类是所有QT事件响应类的基类。其他的还有QCursor、QPen、QTab等类描述的窗口组件可以在窗体的任意地方出现,因此直接从Qt基类继承。

QWidget类是组件容器,所有可以结合在一起的组件都从该类继承。QWidget类继承自QObject类,因为所有的窗体组件都是应用组件的一部分。

  Qt类库组织合理,在使用的时候按照类的集成关系操作。如QButton、QSlider等组件可以被加入到QWidget对象中,而QProcess、QTimer组件是不能加入到QWidget对象中的。


示例效果


工程源码

/*
*功能:滑动Slider控件的滑块时,Spin控件的数值相应改变。同样的,在修改Spin控件值的时候,Slider控件的数值也相应变化
*/
#include <qapplication.h>
#include <qpushbutton.h>
#include <qlayout.h>
#include <qslider.h>
#include <qspinbox.h>
#include <qwidget.h>
class MyWidget : public QWidget
{
public:
MyWidget(QWidget *parent=0); //声明MyWidget类的构造函数
}; //注意分号
MyWidget::MyWidget(QWidget *parent):QWidget(parent)
{
QSpinBox *agenum_sb=new QSpinBox();
agenum_sb->setRange(0,100);
agenum_sb->setValue(0);
QSlider *agenum_sl=new QSlider(Qt::Horizontal);
agenum_sl->setRange(0,100);
agenum_sl->setValue(0);
connect(agenum_sb,SIGNAL(valueChanged(int)),agenum_sl,SLOT(setValue(int)));
//设置Spin控件修改数值响应函数,将Spin控件改变数值的事件与Slider控件关联
connect(agenum_sl,SIGNAL(valueChanged(int)),agenum_sb,SLOT(setValue(int)));
//设置SLider控件修改数值响应函数,将Slider控件改变数值的事件与Spin控件关联
QHBoxLayout *layout=new QHBoxLayout; //创建列布局的对象
layout->addWidget(agenum_sb);
layout->addWidget(agenum_sl);
setLayout(layout); //设置MyWidget使用列布局
setWindowTitle("Enter a number By-Mystery"); //设置窗体标题
}
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MyWidget widget;
widget.show();
return app.exec();
}

Qt中信号与槽系统

  源码中的connect()函数原型为:connect(boject1, signal, object2, slot);

  其中,Object1和Object2分别代表两个不同的Qt对象(继承自QObject基类),signal代表Object的信号,slot代表Object2的槽。

信号和槽是Qt引进的一种处理机制,信号可以被理解为一个对象发出的事件请求,槽是处理信号的函数。

设计信号和槽的机制是为了避免回调函数的缺点。回调函数是一个函数指针,如果希望一个处理函数发出一些通知事件,可以把另一个函数的指针传递给处理函数,处理函数在适当的时候使用函数指针回调通知函数。从回调函数的调用过程可以看出,回调函数存在类型不安全和参数不安全的缺点。因为对于调用函数来说,通过函数指针无法判断出函数的返回类型以及参数类型。

  信号和槽能完成回调函数的所有功能,并且信号和槽机制是类型安全的,而且还能完成其他许多复杂的功能。

  信号和槽不仅是单一的对应关系,还可以是多对多的关系。一个信号可以被连接到多个槽,一个槽也可以响应多个信号,此外,信号之间也可以被连接。

本文出自 “成鹏致远” 博客,请务必保留此出处http://infohacker.blog.51cto.com/6751239/1199405

最新文章

  1. SharePoint Online 创建门户网站系列之首页布局
  2. 设置SecureCRT会话的缓冲区大小
  3. Lua 5.1 参考手册
  4. PHP基本知识
  5. MyISAM 和 InnoDB 讲解
  6. linux_x86_64 blat安装
  7. 一个好用的Log管理类
  8. Q4: Two Sum
  9. 解决MVC Jquery&quot;此请求已被阻止,因为当用在 GET 请求中时,会将敏感信息透漏给第三方网站&quot;的问题
  10. POJ 1458 Common Subsequence 最长公共子序列 LCS
  11. zabbix学习入门总结
  12. mac忘记登陆密码解决
  13. HDU2544-最短路(最短路模版题目)
  14. string 与wstring 的转换
  15. css简单实现五角星评分、点赞收藏、展示评分(半颗星、1/3颗星)
  16. Abp异常-找不到方法:“System.String Abp.Runtime.Security.SimpleStringCipher.Decrypt(System.String, System.String, Byte[])”
  17. java maven 编译文件时 有些类型文件 不存在
  18. Python集成开发工具Pycharm的使用方法:复制,撤销上一步....
  19. timescale 时间尺度
  20. appium --log-timestamp &gt; appium.log

热门文章

  1. oracle安装后listener.ora文件
  2. ios持久化存储
  3. React(0.13) 服务端渲染的两个函数
  4. magento 为用户注册增加一个字段(转)
  5. Android如何实现TCP和UDP传输
  6. Create PDB with Sample schemas in 12C
  7. Oracle 12C -- clone a non-cdb as a pdb
  8. 跟我学SharePoint 2013视频培训课程—— 版本控制以及内容审批(14)
  9. Android Developers:支持不同的屏幕密度
  10. Intellij dea 注释行如何自动缩进?