1. 简介

  • 跨平台 GUI 通常有三种实现策略

    • API 映射

      • 相当于将不同平台的 API 提取公共部分。界面库使用同一套 API,将其映射到不同的底层平台上面。相当于取交集
      • 如wxWidgets。
      • 优点:工作量小,用的是各平台的原生组件,行为一致
      • 缺点:只有公共控件,编写库代码的时候需要大量工作用于适配不同平台
    • API 模拟
      • 在API映射的基础上,不同平台的有差异 API,将使用工具库自己的代码用于模拟出来。相当于取并集
      • 如wine和微软的DirectorX。
      • 优点:应用程序无需重新编译,即可运行到特定平台上
      • 缺点:
    • GUI 模拟
      • 相当于用各平台的底层图形绘制函数等进行重绘
      • 如 gtk+、swing、Qt
      • 优点:可以方便得修改组件外观
      • 缺点:工作量大
  • QLabel label("Hello, world");比直接new要好,避免了内存泄露

2. 信号槽机制

  • 所谓信号槽,实际就是观察者模式。当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal)。这种发出是没有目的的,类似广播。如果有对象对这个信号感兴趣,它就会使用连接(connect)函数,意思是,用自己的一个函数(成为槽(slot))来处理这个信号。也就是说,当信号发出时,被连接的槽函数会自动被回调。这就类似观察者模式:当发生了感兴趣的事件,某一个操作就会被自动触发。
  • QObject
    • 一个类想要有信号槽功能,必须继承QObject,并且在类定义中使用Q_OBJECT宏,其在宏展开时会为类提供信号槽机制、国际化机制以及 Qt 提供的不基于 C++ RTTI 的反射能力
    • Q_OBJECT这个宏会由moc进行处理。这里你可以将moc其理解为一种预处理器,是比 C++ 预处理器更早执行的预处理器。
      • moc 会读取标记了 Q_OBJECT 的头文件,生成以 moc_ 为前缀的文件,比如 newspaper.h 将生成 moc_newspaper.cpp。你可以到构建目录查看这个文件,看看到底增加了什么内容。注意,由于 moc 只处理头文件中的标记了Q_OBJECT的类声明,不会处理 cpp 文件中的类似声明。
    • 发送者和接收者都需要是QObject的子类(当然,槽函数是全局函数、Lambda 表达式等无需接收者的时候除外)
  • connect
    • 使用connect的多个重载函数,来定义和建立信号槽关系(谁触发,谁接受,传什么,接受者干什么)
    • 使用QObject::connect()函数连接信号和槽。
  • signals
    • 使用 signals 标记信号函数,信号是一个函数声明,返回 void,不需要实现函数代码;
    • 类中的signals块所列出的,就是该类的信号。信号就是一个个的函数名,返回值是 void(因为无法获得信号的返回值,所以也就无需返回任何值),参数是该类需要让外界知道的数据。信号作为函数名,不需要在 cpp 函数中添加任何实现
  • SIGNAL和SLOT宏
    • 多用于connect函数中,将函数转换为字符串参数
    • 多用于Qt4??,因此其只能有字符串参数?
  • emit
    • 是 Qt 对 C++ 的扩展,是一个关键字(其实也是一个宏)。emit 的含义是发出,也就是发出某个信号
    • 使用 emit 在恰当的位置发送信号;
  • 槽函数是普通的成员函数,作为成员函数,会受到 public、private、protected 的影响;

3. 模块

  • Qt 5 与 Qt 4 最大的一个区别之一是底层架构有了修改。Qt 5 引入了模块化的概念,将众多功能细分到几个模块之中。Qt 4 也有模块的概念,但是是一种很粗的划分,而 Qt 5 则更加细化。
  • Qt 基础模块主要有:Qt Core、Qt Gui、Qt Multimedia、Qt Network、Qt Qml、Qt Quick、Qt SQL、Qt Test、Qt Webkit。
  • 比如使用vs+插件创建Qt工程时,有一步会让你选择模块,默认选中了Qt Core、Qt Gui、Qt Webkit。

4. 界面

  • 比如使用vs+插件创建Qt工程时,有一步会让你设置要创建的默认界面,基类可以选择QMainWindow、QWidget或者QDialog,同时生产.h、.cpp、.ui、.qrc文件。

5. 其他

  • IDE可以使用

    • visual studio 2012 + Qt + qt-vs-addin
    • visual studio 2017 + Qt + qt-vsaddin-msvc2017-2.2.1.vsix
    • QCreator
  • vs中可以先用Qt Designer做界面(类似winform),生成.ui文件、ui_xxx.h及moc_xxx.cpp文件,然后在自己的xxx.cpp中:QDialog(parent), ui(new Ui::DialogPasswordChange)

Qt学习(一)的更多相关文章

  1. QT学习第1天

    QT学习第一天  坚持住!! 一 Qt概述 1.Qt发展历史 (1)1991年诞生(Haavard Nord/Eirik Chambe-Eng), (2)1994年创立Troll Tech(奇趣科技) ...

  2. 【转载】分享一些Qt学习资源,欢迎下载

    资源来源:http://bbs.csdn.net/topics/390358737 经过我一翻整理,把一些我收集到的Qt学习资源分享给大家,主要适合新手,老鸟可以直接忽略我.要说明一下,很多资源都是在 ...

  3. QT学习之路--创建一个对话框

    Q_OBJECT:这是一个宏,凡是定义信号槽的类都必须声明这个宏. 函数tr()全名是QObject::tr(),被他处理过的字符串可以使用工具提取出来翻译成其他语言,也就是做国际化使用. 对于QT学 ...

  4. 转载: Qt 学习之路 2归档

    Qt 学习之路 2归档 http://www.devbean.net/2012/08/qt-study-road-2-catelog/

  5. Qt 学习资料

    Qter开源社区http://www.qter.org/ [Qt教程], 作者yafeilinux [视频] QT学习之路:从入门到精通 <C++ Qt 编程视频教程>

  6. qt学习笔记(五) QGraphicsPixmapItem与QGraphicsScene的编程实例 图标拖动渐变效果

    应大家的要求,还是把完整的project文件贴出来,大家省点事:http://www.kuaipan.cn/file/id_48923272389086450.htm 先看看执行效果,我用的群创7寸屏 ...

  7. Qt学习博客推荐

    附录C Qt资源 C.1 Qt 官方资源 全 球各大公司以及独立开发人员每天都在加入 Qt 的开发社区.他们已经认识到了Qt 的架构本身便可加快应用程序开发进度.这些开发人员,无论是想开发单平台软件. ...

  8. qt学习教程1.qt开发环境搭建

    qt学习教程1.qt开发环境搭建 首先下载qt 下载地址:http://download.qt.io/archive/qt/ 此教程使用的版本为5.1.1 下载好后,打开安装包,然后点下一步 选择一个 ...

  9. QT学习教程

    原地址:http://www.devbean.NET/2012/08/qt-study-road-2-catelog/ 网上看到的不错的教程 本教程以qt5为主,部分地方会涉及qt4.据说非常适合qt ...

  10. Qt学习之路

      Qt学习之路_14(简易音乐播放器)   Qt学习之路_13(简易俄罗斯方块)   Qt学习之路_12(简易数据管理系统)   Qt学习之路_11(简易多文档编辑器)   Qt学习之路_10(Qt ...

随机推荐

  1. Django timezone问题

    今天用django做个blog碰到了问题,提交内容后浏览提示Database returned an invalid value in QuerySet.datetimes(). Are time z ...

  2. ATL接口返回类型&&ATL接口返回字符串BSTR*

    感觉在ATL中做COM组件,添加方法的时候,其返回值只能是HRESULT,我想返回其他数据类型,可以吗? 非也非也 HRESULT指示返回的状态,即正确与否, 返回值是这样的 HRESULT MyMe ...

  3. 动态修改datagrid中的numberbox的最大值和最小值

    注意datagrid使用的触发函数是: onBeginEdit,只有在这个触发条件下,editor才真正初始化完成,不然没法动态修改numberbox中的最大最小值. 示例代码:(注意这一块:onBe ...

  4. Python常见函数用法

    1. shape()函数 在numpy模块 输入参数:类似数组(比如列表,元组)等,或是数组 返回:一个整型数字的元组,元组中的每个元素表示相应的数组每一维的长度 # shape[0]返回对象的行数, ...

  5. 使用jquery修改表单的提交地址

    基本思路: 通过使用jquery选择器得到对应表单的jquery对象,然后使用attr方法修改对应的action 示例程序一: 默认情况下,该表单会提交到page_one.html 点击button之 ...

  6. Ubuntu Server 12.04 LTS搭建SVN服务及修改端口

    采用了apache结合svn的方式. 首先安装apache.subversion.svn-apache sudo apt-get install apache2 sudo apt-get instal ...

  7. cannot import name '_validate_lengths' from 'numpy.lib.arraypad'

    在Anaconda下新配置了tensorflow环境,结果在引入skimage 包时报错,错误提示from numpy.lib.arraypad import _validate_lengths,找不 ...

  8. 274. H-Index论文引用量

    [抄题]: Given an array of citations (each citation is a non-negative integer) of a researcher, write a ...

  9. 用python控制路由器

    前言 最近用爬虫爬豆瓣上的资料,无奈总是被封,agent伪装和cookie修改这些都用过了,可惜都起不了什么作用,到了一定次数,还是会返回403.想用代理ip,无奈免费的太不稳定,买收费的又有点没必要 ...

  10. Tsung测试之配置文件

    Jabber配置: <?xml version="1.0"?> <!DOCTYPE tsung SYSTEM "/usr/local/tsung/sha ...