Qt学习第一天

Posted 五个板栗

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt学习第一天相关的知识,希望对你有一定的参考价值。

一、Qt的介绍

  • Qt是一个跨平台的C++图形用户界面应用程序框架
  • 支持Linux、类Unix系统、windows、Mac os以及嵌入式平台。
  • Linux的图形界面有KDE和gnome,其中KDE就是用Qt写的
  • MSVC和MinGW是两种不同的编译器

MSV:纯Qtcreator方式,QtCreator编码+MinGw或MSVC或其他编译

MinGW:小型的Linux编译环境,mingw使用的是bash命令行模式。VS+Qt库,把Qt当成一个界面库来在VS中调用,VS编码+MSVC编码

常见名词

  • Class name 类名
  • Base class  基类(父类):有三大基类:
  1. QMainWindow  主要用于pc端,带菜单栏
  2. QWidget  窗口基类
  3. QDialog  对话框基类
  • signal 信号
  • slot 槽
  • Generate form 创建界面

二、Qt的框架

#include <QApplication>
int main(int argc,char *argv[])

QApplication a(argc,argv);
//代码
return a.exec();

Qt学习第一天_Qt

Qt学习第一天_信号和槽_02

三、项目文件(.pro)

一个应用程序对应一个项目文件,是qmake自动生成的用于生产makefile的配置文件。

四、第一个Qt程序

第一步:建立一个空项目(只会生成一个.pro的项目文件),在.pro文件中写入 QT+=widgets 就可以变成图形界面编程。

第二步:新建文件,添加c++ source file文件,命名为main.c

第三步:书写main.c文件

//先写好框架
#include <QApplication>

int main(int argc,char *argv[])

QApplication app(argc,argv);
//自定义代码
app.exec();
return 0;

Qt学习第一天_内存回收_03

控件默认是隐藏的,所以需要人为的显示:w.show();

Qt学习第一天_内存回收_04

#include <QApplication>
#include <QWidget>
#include <QPushBUtton>
int main(int argv,char *argc[])

QApplication app;
QWidget w;
w.setWindowTitle("第一个Qt程序")
w.show();
QPushButton b;
b.setText("^_^");
b.show();
return app.exec();

Qt学习第一天_窗口_05

这时候出现了两个窗口,相互是独立的,这不是我们想要的,我们想把按钮放到窗口上面。

#include <QApplication>
#include <QWidget> //窗口基类控件
#include <QPushButton>
int main(int argc,char *argv[])

QApplication app(argc,argv);
QWidget w;
w.setWindowTitle("第一个Qt程序");
QPushButton b;
b.setText("^——^");
//b.show();//控件默认是隐藏的,需要人为显示
//但是如果不指定父对象,对象和对象(窗口和窗口之间就是没有关系的),这样显示出现了两个窗口,是相互对立的
//想要把按钮放在窗口上面,需要指定父对象,a指定b为父对象,就是将a放在b上面
//指定父对象的方法有两种
//1. setParent(); 2.通过构造函数传参 这时候只需要父对象显示,上面的子对象就会自动显示
b.setParent(&w);//指定父对象
w.show();
return app.exec();

默认是以左上角为起点的,也可以自己设置位置  b.move(100,100);

Qt学习第一天_信号和槽_06

Qt学习第一天_内存回收_07

五、父窗口和子窗口(控件,部件和构件)

六、信号和槽

信号

  • 信号必须有signals关键字来声明
  • 信号没有返回值
  • 信号就是函数的声明,只需要声明,无需定义
  • 使用emit在恰当的位置发送信号
  • 信号可以重载,就是几个信号可以使用同一个名字,参数不一样就可以了
  • 槽函数(回调函数),信号属于谁,就是谁发出的

this指针

  • this指针是C++中的一个关键字,也是一个const指针,它指向当前对象,通过它可以访问当前对象的所有成员。
  • this只能用在类的内部,通过this可以访问类的所有成员,包括private、protected、public属性的。
  • this是一个指针,要用->来访问成员变量或者成员函数
  • this是const执政,它的值不能被修改,一切修改该指针的操作,如赋值、递增、递减都是错误的。
  • this只能在成员函数内部使用,用在其他地方没有意义,也是非法的。
  • 只有当对象被创建后this才有意义,因此不能再static成员函数中使用。

槽函数

  • 和普通函数用法相同,槽函数可以是任意的成员函数、普通的全局函数、静态函数
  • 槽函数需要和信号一致(参数、返回值)
  • 由于信号都是没有返回值的,所以槽函数也没有返回值
  • 信号和槽是Qt对象之间通信的接口。
  • connect()是信号连接函数,其中每个参数都是指针类型。

Lamda表达式用于定义并创建匿名函数对象

  • 是c++11新增加的特性,在项目文件中加入:CONFIG +=C++11 新版已经自动内置了
  • 在Qt中配合信号一起使用,非常的方便
  • connect()一般形式 connect(sender,signal,receiver,slot);
  • sender:发出信号的对象 signal:发送对象发出的信号 receiver:接收信号的对象 slot:接收对象在接收到信号之后所需要调用的函数

Lamda表达式的基本构成

Qt学习第一天_窗口_08

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

① 函数对象参数;

[],标识一个Lambda的开始,这部分必须存在,不能省略。函数对象参数是传递给编译器自动生成的函数对象类的构造函数的。函数对象参数只能使用那些到定义Lambda为止时Lambda所在作用范围内可见的局部变量(包括Lambda所在类的this)。函数对象参数有以下形式:

  1. 空。没有使用任何函数对象参数。
  2. =。函数体内可以使用Lambda所在作用范围内所有可见的局部变量(包括Lambda所在类的this),并且是值传递方式(相当于编译器自动为我们按值传递了所有局部变量)。
  3. &。函数体内可以使用Lambda所在作用范围内所有可见的局部变量(包括Lambda所在类的this),并且是引用传递方式(相当于编译器自动为我们按引用传递了所有局部变量)。 
  4. this。函数体内可以使用Lambda所在类中的成员变量。
  5. a。将a按值进行传递。按值进行传递时,函数体内不能修改传递进来的a的拷贝,因为默认情况下函数是const的。要修改传递进来的a的拷贝,可以添加mutable修饰符。
  6. &a。将a按引用进行传递。
  7. a, &b。将a按值进行传递,b按引用进行传递。
  8. =,&a, &b。除a和b按引用进行传递外,其他参数都按值进行传递。
  9. &, a, b。除a和b按值进行传递外,其他参数都按引用进行传递。

② 操作符重载函数参数;

标识重载的()操作符的参数,没有参数时,这部分可以省略。参数可以通过按值(如:(a,b))和按引用(如:(&a,&b))两种方式进行传递。

③ 可修改标示符;

mutable声明,这部分可以省略。按值传递函数对象参数时,加上mutable修饰符后,可以修改按值传递进来的拷贝(注意是能修改拷贝,而不是值本身)。

④ 错误抛出标示符;

exception声明,这部分也可以省略。exception声明用于指定函数抛出的异常,如抛出整数类型的异常,可以使用throw(int)

⑤ 函数返回值;

->返回值类型,标识函数返回值的类型,当返回值为void,或者函数体中只有一处return的地方(此时编译器可以自动推断出返回值类型)时,这部分可以省略。

⑥ 是函数体;

    ,标识函数的实现,这部分不能省略,但函数体可以为空。

七、坐标系统

  • 对于父窗口,坐标系统相对于屏幕,原点相对于屏幕左上角,x向右递增,y向下递增
  • 对于子窗口,坐标系统相对于父窗口,原点相对区域左上角,x向右递增,y向下递增

八、内存回收机制 new-delete 

  • QPushButton *b=new QPushButton(this);
  • this:表明当前对象为它的父对象
  • 指定父对象后或者之间或者间接继承于QOject,子对象如果是动态分配空间的,不需要要手动释放delete

九、带菜单栏的窗口

QMainWindow是一个为用户提供主窗口程序的类,包含一个菜单栏(menubar)、多个工具栏(toolbars)、多个锚接部件(dock widgets)、一个状态栏(status bar)以及一个中心部件(central widget),是许多应用此程序的基础,如文本编辑器、图片编辑器。

  • 菜单栏
#include "mainwindow.h"
#include <QMenuBar>//菜单栏的头文件
#include <QMenu>//菜单的头文件
#include <QAction>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)

setWindowTitle("C++11");
resize(800,800);
QMenuBar *MenBqr=menuBar();//生成一个菜单栏
//在菜单栏上创建菜单
QMenu *File=MenBqr->addMenu("文件");//生成一个文件菜单
QMenu *Edit=MenBqr->addMenu("编辑");//生成一个编辑菜单
QMenu *View=MenBqr->addMenu("View");//生成一个View菜单
QMenu *Test=MenBqr->addMenu("调试");//生成一个调试菜单
//在菜单上创建菜单项,或者说是添加动作,菜单项是弹式窗口
QAction *newFile=File->addAction("新建文件");
QAction *undo=Edit->addAction("撤销");
QAction *show=View->addAction("显示");
QAction *st_te=Test->addAction("开始调试");
//
connect(newFile,&QAction::triggered,
[=]()

qDebug()<<"新建了一个文件";

);
connect(undo,&QAction::triggered,
[]()

qDebug()<<"回到上一步";

);
connect(show,&QAction::triggered,[]()

qDebug()<<"显示完毕";

);
connect(st_te,&QAction::triggered,[]()

qDebug()<<"开始调试";

);



MainWindow::~MainWindow()


Qt学习第一天_内存回收_09

  • 工具栏

主窗口的工具栏上可以有很多工具条,通常采用一个菜单对应一个工具条的方式,也可以根据需要进行工具条的划分。

  1. 直接调用QMainWindow类的addToolBar()函数获取主窗口的工具条对象,每增加一个工具条都需要调用一次该函数。
  2. 插入属于工具条的动作,即在工具条上添加操作。通过QToolBar类的addAction函数添加。
  3. 工具条是一个人可以移动的窗口,它的停靠区域由QToolBar的allowAreas决定,包括

Qt::LeftToolBarArea  停靠在左侧

Qt::RightToolBarArea 停靠在右侧

Qt::TopToolBarArea 停靠在顶部

Qt::BottomToolBarArea 停靠在底部

Qt::AllToolBarea  以上四个位置都可以停靠

使用setAllowedAreas()函数指定停靠区域
setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolArea)
使用setMoveable()函数设定工具栏的可移动性
setMoveable(false)//说明工具条不可以移动,只能停靠在初始化的位置上
  • 状态栏

派生自QWidget类,使用方法与QWidget类似,QStatusBar类常用成员函数

//添加小部件
void addWidget(QWidget *widget,int stretch=0)
//插入小部件
void insertWidget(int index,QWidget *widget,int stretch=0)
//删除小部件
void removeWidget(QWidget *widget)
  • 核心控件

QLabel:显示文本,图片和动画等

QLineEdit:提供单行文本编辑框

十、对话框

对话框时Gui程序中不可或缺的组成部分。很多不能或者不适合放入主窗口的功能组件都必须放在对话框中设置。对话框通常是一个顶层窗口,出现在程序最上层,用于实现短期任务或者简洁的用户交互。

Qt中使用QDialog类来实现对话框,就像主窗口一样,我们通常设计一个类继承QDialog。

QDialog(及其子类,以及所有Qt::Dialog类型的类)的对于其parent指针有额外的解释:如果parent为NULL,则该对话框会作为一个顶层窗口,否则则作为其父组件的子对话框(此时,默认出现的位置是parent的中心)。顶层窗口与非顶层窗口的区别在于顶层窗口在任务栏会有自己的位置,而非顶层窗口则会共享其父组件的位置。

对话框分为模式对话框和非模式对话框。

  • 模式对话框:就是会阻塞同一应用程序中其他窗口的输入模式对话框很常见,比如打开文件功能。尝试记事本打开文件,当打开文件对话框出现时,不能对除此对话框之外的窗口部分进行操作。
  • 非模式对话框,例如查找对话框,我们可以在显示着查找的对话框查找的同时,继续对记事本的内容进行编辑。

标准对话框是Qt内置的一系列对话框,用于简化开发。因为很多对话框都是通用的,比如打开文件、设置颜色、打印等,在所有的程序中几乎相同 ,没有必要每一个都自己实现。

Qt的内置对话框有以下几类:

  • QColorDialog 选择颜色
  • QFileDialog 选择文件或者目录
  • QFontDialog 选择字体
  • QInputDialog 允许用户输入一个值,并且将其值返回
  • QMessageBox 模式对话框,用于显示信息,询问问题
  • QPageSetupDialog 为打印机提供纸张的相关选项
  • QPrintDialog 打印机配置
  • QPrintPreviewDialog 打印预览
  • QProgressDialog 显示操作过程

以上是关于Qt学习第一天的主要内容,如果未能解决你的问题,请参考以下文章

Objective-C学习笔记-第一天

qt的第一天

python3第一天学习(数据类型)

QT学习第1天

QT 中控件内坐标转换为父窗口坐标或屏幕坐标

QT 中控件内坐标转换为父窗口坐标或屏幕坐标