以前学过Qt,但只是为了学分,现在重学。

1. 认识Qt应用程序框架

直接新建一个项目后,自动生成了一下文件,下面一个个理解。

(1)main.cpp

  main.cpp中特别的是QApplication a,和 a.exec();

    如果不构造 QApplication 对象,直接编译并运行,

  结果:

      成功生成可执行文件,并且成功执行,但立即退出,并打印异常信息:

            QWidget: Must construct a QApplication before a QWidget

  上面实验说明 QApplication 对象被 QWidget 对象使用。

  此外,将 a.exec(); 换成死循环。

  结果:

    

    QWidget会显示,但是无法响应用户操作。

  经过上面两个实验,可以得出下面结论:

    QApplication 被 QWidget 调用,QApplication 会捕捉用户输入,将其传给 QWidget。

    

(2).pro文件

  

QT       += core gui

  这是加入链接模块。

  问题是如何知道需要什么模块呢?

  对使用的类按F1就可以获得,

greaterThan(QT_MAJOR_VERSION, ): QT += widgets

  这是兼容Qt4以上版本

TARGET = 01_test

  这是指定目标名称,也就是最终生成的可执行文件名称

TEMPLATE = app

  生成应用程序,其他二进制文件

SOURCES += \
        main.cpp \
        widget.cpp

HEADERS += \
        widget.h

  类似Makefile

(3)Qt的生成应用程序的过程

发现Qt生成应用程序有两步:qmake 和 构建

实验发现 qmake 是生成指导编译链接的Makefile,和建立两个文件夹debug和release

构建应该就是运行makefile

2. 父对象与子对象

  父子对象不是继承关系,有点像组合。

  大概有三个性质:

  (1)父子对象机制是在QObject类中实现的,只有继承了QObject才能使用父子对象机制。

  (2)父对象show时,子对象也会show,但是子对象不能单独show,子对象的坐标是相对于父对象的。

  (3)父对象析构时,会先析构其子对象,子对象会析构孙子对象。

3. 信号与槽

  信号与槽是观察者模式,当控件发现自己的某个事件发生后就发出信号,信号以广播形式发送,谁对该信号感兴趣就调用connect函数将信号与自己的槽函数绑定,只要信号发生就回调槽函数。

  connect(sender &Sender::signal, receiver, &Receiver::slot);

  (1)关于内存分配

    connect 之前,释放 sender 内存,程序运行时出错, 释放 receiver,程序运行不会报错。

    connect 之后,释放 sender,程序正常运行,释放receiver,程序正常运行,这说明connect可以通过释放sender或receiver取消。

  (2)多次运行相同connect

    当信号发出后,会触发多次槽函数。

  其他:

    (1)只有继承了 QObject类并且添加宏Q_OBJECT才能使用信号槽。

    (2)信号无函数体,槽函数可以为任何函数,若槽函数为成员函数,会受访问权限影响

    (3)信号槽可以有参数,但槽函数参数应保证能正确接受信号参数。

4. Lambda表达式

  C++11中的Lambda表达式用于定义并创建匿名的函数对象。

  格式:

[函数对象参数](操作符重载函数参数)mutable或exception ->返回值{函数体}

  []:

    标识Lambda的开始,

    确定函数对象参数(或者说是函数对象的成员函数),注意只能将 Lambda 可见范围内的变量作为成员函数。

    =:

      以传值的方式,将Lambda所有可见变量传入,并且为只读属性。

    &:

      以引用方式。将所有可见变量传入。

    this:

      只将this指针传入

    a:

      只将指定变量a以传值方式传入。

    &a

      只将变量a以引用方式传入

    mutable:

      以传值方式传入的变量可写。

    ->返回值类型

      当返回类型为void,或只有一处返回,编译器可以推断出返回类型,所以可以省略。

重头开始学Qt——day1的更多相关文章

  1. 占个坑 未来学qt的时候专用

    今天看了一个大佬发了一个上位机图片便向大佬问道 ”上位机是用什么软件做的“大佬抛下一句qt ,在业界内很通用,windows和linux通吃,便让我萌生了一个想法,去学qt.虽说上位机时常听到,但是自 ...

  2. 从头学Qt Quick(1) --体验快速构建动态效果界面

    自2005年Qt4发布以来,Qt已经为成千上万的应用程序提供了框架服务,现在Qt已经基本上支持所有的开发平台了,这里面既包含了桌面.嵌入式领域,也包括了Android.IOS.WP等移动操作平台,甚至 ...

  3. 零基础学QT编程

    吴迪.2010.1 北京航空航天大学出版社   Qt资源 CSDN QT http://bbs.csdn.net/forums/Qt/ QT编程网 http://www.qtbcw.com/ 编程论坛 ...

  4. 从头学Qt Quick(3)-- 用QML写一个简单的颜色选择器

    先看一下效果图: 实现功能:点击不同的色块可以改变文字的颜色. 实现步骤: 一.创建一个默认的Qt Quick工程: 二.添加文件Cell.qml 这一步主要是为了实现一个自定义的组件,这个组件就是我 ...

  5. 从头学Qt Quick(2)-- QML语法从一个简单的例子说起

    在上一篇文章中,我们对QtQuick做了简单的介绍,体验了使用QML语言构建一个UI的便捷.这里我们简要介绍一下QML的语法. QML将界面分成一些更小的元素,这些元素可以组成一个组件,QML语言描述 ...

  6. 渣渣学QT

    初学QT,自己的一些小总结,错误之处,望大神指点一二: 1,添加资源文件时想应用在界面的背景,但是发现用不了,后来才知道是没有"构建"?应该是要在构建之后才将所添加的资源文件真正的 ...

  7. 【学QT】 3 - DEBUG集子

    1. [root@localhost helloqt]# make g++ -Wl,-rpath,/usr/local/qt/lib -o cfconv .obj/main.o .obj/cfconv ...

  8. 【学QT】2 - QT/E环境的建立

    Arm-Linux嵌入式QT/E环境的建立(qt/e 3.x系列)          QT/E 3.x系列比QT/E 2.x系列有非常大的改进,大大提高了开发进度,不再使用tmake,安装也更简单.但 ...

  9. 【学QT】1 - QT的安装

    1.解压文件在/usr/local/下 #tar zxvf qt-x11-free-3.3.8b.tar.gz -C /usr/local 更改文件夹名称为qt #mv /usr/local/qt-x ...

随机推荐

  1. 应该知道的一些Markdown语法

    目录 快速输入标题 斜体和粗体,删除线 分隔线 外链接 无序列表 有序列表 定义型列表 插入图片 文字引用 标签分类 表格 行内代码块 代码段 注脚 待办事宜 Todo 列表 显示当前文章的目录 快速 ...

  2. 从零开始的全栈工程师——js篇(js的异步)

    js中的异步 Javascript语言的执行环境是"单线程"(single thread,就是指一次只能完成一件任务.如果有多个任务,就必须排队,前面一个任务完成,再执行后面一个任 ...

  3. html+css杂记

    overflow可设置超出后隐藏 子元素撑开父级元素:①父级元素宽度不固定,②父级元素设置为inline-block或者添加float: html中的中文在浏览器打开为乱码(已经写了<meta ...

  4. CSS透明度设置(兼容性)

    一句话搞定透明背景! .transparent_class { filter:alpha(opacity=50); -moz-opacity:0.5; -khtml-opacity: 0.5; opa ...

  5. <Android 基础(十二)> TextInputLayout,让输入框更有灵性

    介绍 Layout which wraps an {@link android.widget.EditText} (or descendant) to show a floating label wh ...

  6. System.Data.SqlClient.SqlException: 从 datetime2 数据类型到 datetime 数据类型的转换产生一个超出范围的值

    System.Data.SqlClient.SqlException: 从 datetime2 数据类型到 datetime 数据类型的转换产生一个超出范围的值.解决办法是: 而这位大哥提出的解决办法 ...

  7. 洛谷 P1080 国王游戏

    题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排成一排,国王站在队伍的最 ...

  8. C#中RichTextBox字体不统一(中英文)

    this.richTextBox1.Font = new System.Drawing.Font("微软雅黑", 12F);// new System.Drawing.Font(& ...

  9. leetcode: 贪心

    1. jump game Given an array of non-negative integers, you are initially positioned at the first inde ...

  10. 2019.03.15 ZJOI2019模拟赛 解题报告

    得分: \(20+45+15=80\)(三题暴力全写挂...) \(T1\):Lyk Love painting 首先,不难想到二分答案然后\(DP\)验证. 设当前需验证的答案为\(x\),则一个暴 ...