Qt学习之路之学习笔记

来源:互联网 发布:2016cf手游刷枪软件 编辑:程序博客网 时间:2024/05/02 00:50


最近在网上看到一个Qt学习之路系列,初步浏览了一下。觉得不错。目前网上的系列学习文章并不太多,先从这个开始学起吧。

打算看完这个再看《C++ GUI Programming with Qt4》

 

http://devbean.blog.51cto.com/448512/d-8

 

Qt学习之路(1):前言 http://www.qteverywhere.com/archives/466

     C++ GUI编程:以前就用过MFC,现在了解了Qt,还有wxWidget, gtk++

     Qt:问题:非原生风格,要用qmake预处理。

           优点:SIGNAL/SLOT机制,跨平台。

    LGPL。这意味着,你可以将Qt作为一个库连 接到一个闭源软件里面


Qt学习之路(2):Hello, world!  http://www.qteverywhere.com/archives/468

      Qt的安装地址:https://qt.nokia.com/downloads   

      Qt的开发环境:目前用VS2005+qt-vsintegration-1.4.3开发windows上运行环境。

                           Qt Creator编译symbian模拟器上运行。

      pro就是工程文件(project),它是 qmake自动生成的用于生产makefile的配置文件


Qt学习之路(3):Hello, world!(续)  http://www.qteverywhere.com/archives/480

      main函数中要有一个QApplication对象,传入argc, argv参数。

      Widget等同于Windows技术里面的控件(controls)和容器(containers),大多数Qt程序使用QMainWindow或者QDialog作为顶级组件

      组件创建出来之后通常是不可见的,使用show方法显示,避免出现之后在屏幕上面会有闪烁

      exec()程序的事件循环就开始了

      注意,我们并没有使用delete去删除创建的QLabel,因为在程序结束后操作系统会回收这个空间

      qmake -project 命令创建.pro文件

      qmake helloworld.pro (make)或者qmake -tp vc helloworld.pro (nmake)生成makefile,然后才能调用make或者是nmake进行编译

      Qt也是支持HTML解析的。


Qt学习之路(4):初探信号槽  http://www.qteverywhere.com/archives/485

       就像是插销一样:一个插头和一个插座。也类似与回调函数,触发等。

      QObject里面有一个connect静态函数,用于连接信号槽

       Qt使用信号槽机制完成了事件监听操作


Qt学习之路(5):组件布局

      只要把组件放入某一种布局之中,当需要调整大小或者位置的时候,Qt就知道该怎样进行调整

      layout使用addWidget添加组件,使用addLayout可以添加子布局 QHBoxLayout/QVBoxLayout/QGridBoxLayout


Qt学习之路(6): API文档的使用

      Qt Assistant


Qt学习之路(7/8): 创建一个对话框

      所谓前向声明就是告诉编译器,我要用这几个类。因为仅仅使用的是指针,并不涉及到这些类的函数,因此并不需要include它们的头文件

      Q_OBJECT。这是一个宏。凡是定义信号槽的类都必须声明这个宏。

      signal:,这是Qt的关键字,对信号的定义

      private slots:是私有的槽的定义。

      我们最好只引入需要的组件

      构造函数有参数初始化列表,用来调用父类的构造函数

      函数tr()全名是 QObject::tr(),被它处理的字符串可以使用工具提取出来翻译成其他语言,也就是做国际化使用。

      所有使用了Q_OBJECT宏的类都自动具有tr()函数

      字符串中的&代表快捷键ALT+xxx

      label使用了setBuddy函数,它的意思是,当label获得焦点时,比如按下Alt+W,它的焦点会自动传给它的 buddy

      connect()函数也是QObject的,因为我们继承了QObject,所以能够直接使用。

      rightLayout的addStretch()添加的,就像弹簧一样,把上面的组件“顶起来”。


Qt学习之路(9):深入了解信号槽

      槽函数和普通的C++成员函数没有很大的区别。它们也可以使virtual的;可以被重写;可以使public、protected或者 private的;可以由其它的C++函数调用;参数可以是任何类型的。如果要说区别,那就是,槽函数可以和一个信号相连接,当这个信号发生时,它可以被自动调用。

      connect( sender, SIGNAL( signal ) , receiver, SLOT( slot) ) ;

      一个信号可以和多个槽相连:但是它们的调用顺序是不确定的。

     多个信号可以连接到一个槽

     一个信号可以连接到另外的一个信号

    槽可以被取消链接disconnect( lcd, SIGNAL( overflow( ) ) , this , SLOT( handleMathError( ) ) ) ; 当一个对象delete之后,Qt自动取消所有连接到这个对象上面的槽。

    信号和槽的参数个数、类型以及出现的顺序都必须相同

    如果信号的参数多于槽的参数,那么这个参数之后的那些参数都会被忽略


Qt学习之路(10): Meta-Object系统

      Qt提出了一个Meta-Object系统。它提供了两个关键的作用:信号槽和内省。

      内省又称为反射,允许程序在运行时获得类的相关信息,也就是meta-information,也就是“元信息”

      Qt提供了一个独立的工具,moc,通过定义Q_OBJECT宏实现到标准C++函数的转变

      首先,Q_OBJECT宏声明了一些QObject子类必须实现的内省的函数,如metaObject(),tr(),qt_metacall()等;

      第二,Qt的moc工具实现Q_OBJECT宏声明的函数和所有信号;

      第三,QObject成员函数connect()和disconnect()使用这些内省函数实现信号槽的连接。


Qt学习之路(11): MainWindow

      QMainWindow窗口分成几个主要的区域:Title /MenuBar/ToolsBar/Dock Window areas/Central Widget/Status Bar


Qt学习之路(12/13): 菜单和工具条

      QAction类保存有关于这个动作,也就是action的信息,比如它的文本描述、图标、快捷键、回调函数(也就是信号槽)

      QAction能够根据添加的位置来改变自己的样子 ——如果添加到菜单中,就会显示成一个菜单项;如果添加到工具条,就会显示成一个按钮

      当这个父组件被销毁时,比如 delete或者由系统自动销毁,与其相关联的这个QAction也会自动被销毁。

      QMainWindow有一个menuBar()函数,会返回菜单栏.如果不存在会自动创建,如果已经存在就返回那个菜单栏的指针。

      qrc其实是Qt Recource Collection的缩写

      QToolBar的图标大小默认是32*32,菜单默认是16*16。如果提供的图标小于要求的尺寸,则不做操作,Qt不会为你放大图片;反之,如果提供的图标文件大于相应的尺寸要求,比如是64*64,Qt会自动缩小尺寸。(菜单图标添加失败,没有用qtcreator)


Qt学习之路(14): 状态栏

      statusBar()函数,用于实现状态栏的调用

      在Qt里面,状态栏显示的信息有三种类型:临时信息、一般信息和永久信息

      QStatusBar右下角的大小控制点可以通过setSizeGripEnabled()函数来设置是否存在


Qt学习之路(15): Qt标准对话框之QFileDialog

      QFileDialog是Qt中用于文件打开和保存的对话框QFileDialog:: getOpenFileName/ QFileDialog:: getSaveFileName

      QFileDialog setWindowTitle/setDirectory/setFilter/setAcceptMode/exec/selectedFiles


Qt学习之路(16): Qt标准对话框之QColorDialog

      QColor color = QColorDialog::getColor(Qt::white, this);


Qt学习之路(17): Qt标准对话框之QMeageBox

      QMessageBox::information/

      是static的


Qt学习之路(18): Qt标准对话框之QIutDialog

      QString text = QInputDialog::getText

      还有getInteger,getDouble,getItem三个类似的函数


Qt学习之路(19): 事件(event)

      对于事件,Qt使用一个事件队列对所有发出的事件进行维护,当新的事件产生时,会被追加到事件队列的尾部,前一个事件完成后,取出后面的事件进行处理。

      在Qt中,需要我们关心的事件总会发出一个信号。

      如果我们使用组件,我们关心的是信号槽;如果我们自定义组件,我们关心的是事件。因为我们可以通过事件来改变组件的默认操作。比如,如果我们要自定义一个 QPushButton,那么我们就需要重写它的鼠标点击事件和键盘处理事件,并且在恰当的时候发出clicked()信号。

      当事件发生时,Qt将创建一个事件对象。Qt的所有事件都继承于 QEvent类。在事件对象创建完毕后,Qt将这个事件对象传递给QObject的event()函数。event()函数并不直接处理事件,而是按照事件对象的类型分派给特定的事件处理函数(event handler)。

 

Qt学习之路(20): 事件接收与忽略

      把Qt的事件传递看成链状:如果子类没有处理这个事件,就会继续向其他类传递

      如果希望忽略事件,只要调用父类的响应函数即可。

 

Qt学习之路(38): model-view架构

        MVC模型。model-view-controller模型,即模型-视图-控制器

         模型负责获取需要显示的数据   

        视图用于将模型数据显示给用户

        控制器是模型和视图之间的媒介,

        Qt的model-view架构. 对于控制器部分,Qt使用的是另外的一种抽象,代理delegate。代理被用来提供对item渲染和编辑的控制

        对于很大的数据,我们则需要使用Qt的view类,比如QListView,QTabelView和QTreeView,同时需要提供一个model

          

Qt学习之路(44): QSortFilterProxyModel

        QSortFilterProxyModel并不能单独使用,它只是一个“代理”,真正的数据需要另外的一个model提供,并且它是用来排序和过滤的。所谓过滤,也就是说按照你输入的内容进行数据的筛选,很像Excel里面的过滤器。不过Qt提供的过滤功能是基于正则表达式的 

 

Qt学习之路(45/46/47): 自定义model之一/二/三

        一个model中的每个数据元素都有一个model索引。

        每个数据元素还要有一组属性值

        list model而言,要定位其中的一个数据只需要有一个行号就可以

        table model而言,这种定位需要有两个值:行号和列号

       对于tree model而言,用于定位的可以是这个元素的父节点

       CurrencyModel就是这样一个model。它底层的数据使用一个QMap<QString, double>类型的数据

 


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

原创粉丝点击