Qt 基础 详细总结

本文详细总结了Qt框架的各个方面,包括创建Qt项目、QPushButton控件的使用、对象树、窗口坐标系统、信号与槽机制的重点介绍、QMainWindow的组件使用、对话框的类型与操作、布局管理器的应用、各种控件的详细讲解,以及文件读写操作。通过实例和代码演示,深入解析Qt开发的关键知识点,帮助开发者全面掌握Qt开发。
摘要由CSDN通过智能技术生成

文章目录

Qt

一、创建Qt项目

注意:两个路径都不能有中文

在这里插入图片描述

构建套件:
在这里插入图片描述

类信息:

其中基类有三种可以选择,他们的关系是:
在这里插入图片描述

在这里插入图片描述

1.快捷键

在这里插入图片描述

2.命名规范

在这里插入图片描述

二、QPushButton

例:btn -> show(); //show是以顶层方式弹出窗口控件

//让btn对象 依赖在 myWidget窗口中(父窗口)
btn->setParent(this);

按钮控件需要添加头文件 #include<QPushButton>

1.按钮控件常用API

(1)创建

QPushButton * btn = new QPushButton;

(2)设置父亲

setParent(this); //当前类(当前窗口),所以this

(3)设置文本

setText(“文字”)

(4)设置位置

move(宽,高)

(5)重新指定窗口大小

resize

(6)设置窗口标题

setWindowTitle

(7)设置窗口固定大小

setFixedSize

三、对象树

1. 析构问题

析构的顺序与创建的顺序相反

析构函数qDebug()打印的时候的顺序与实际析构顺序相反

2. 对象树

(1)当创建的对象在堆区时候,如果指定的父亲是QObject派生下来的类或者QObject子类派生下来的类,可以不用管理释放的操作,将对象会放入到对象树中。

(2)一定程度上简化了内存回收机制(就是对象树

技巧:

以后就可以大胆的在堆区(这里指在firstwidget的构造函数中)创建对象,

并将对象myBtn -> setParent(this);设置到对象树中,即可。

到时候这个对象就会被自动析构,不用手动操作。

注意尽量在构造子类对象的时候就同时指定parent对象,这样如果先析构parent对象,这个时候就不会出现二次析构问题,就可以在析构parent对象的同时完全把子类对象析构了。

四、Qt窗口坐标

对于嵌套窗口,其坐标是相对于父窗口来说的。

在这里插入图片描述

五、信号和槽机制(重点)

1. 基本概念与函数参数解释

对象将想要处理的信号和自己的一个函数(即“槽”)绑定,来处理这个信号。

也就是说,当信号发出时,被连接的槽函数会自动被回调。

//信号与槽机制
//需求  点击我的按钮 关闭窗口
//参数1:信号的发送者;  参数2:发送的信号(函数的地址);  参数3:信号的接受者;  参数4:处理的槽函数(函数地址)

//connect(myBtn, &mypushbutton::clicked, this, &firstwidget::close);//这样写也可以(子类/父类)
connect( myBtn, &QPushButton::clicked, this, &QWidget::close  );

2. 自定义信号和槽

(1)代码实现

在这里插入图片描述

创建文件之后的默认代码,此时将自定义信号写在signals下

(2)自定义信号和槽需要注意的事项
  • ​ 发送者和接收者都需要是QObject的子类(当然,槽函数是 全局函数、Lambda 表达式等无需接收者的时候除外);

  • 信号和槽函数返回值是 void(信号和槽都可以有参数)

  • 信号只需要声明,不需要实现

  • 槽函数需要声明也需要实现(槽函数可以写到 public slot 下,也可以写在 public 下 (高低版本差异))

  • ​ 槽函数是普通的成员函数,作为成员函数,会受到 public、private、protected 的影响;

  • 使用 emit 在恰当的位置发送信号

  • ​ 使用connect()函数连接信号和槽。

  • ​ 任何成员函数、static 函数、全局函数和 Lambda 表达式都可以作为槽函数

  • ​ 信号槽要求信号和槽的参数一致,所谓一致,是参数类型一致

  • ​ 如果信号和槽的参数不一致,允许的情况是,槽函数的参数可以比信号的少,即便如此,槽函数存在的那些参数的顺序也必须和信号的前面几个一致起来。这是因为,你可以在槽函数中选择忽略信号传来的数据(也就是槽函数的参数比信号的少)。

(3)函数重载

带参的和不带参的函数地址都一样,所以对于带参的函数重载需要重新写一个连接connect

<1>当自定义信号和槽出现重载
  • ​ 需要利用函数指针 明确指向函数的地址
  • void( Teacher:: * tSignal )( QString ) = &Teacher::hungry;
  • ​ QString 转成 char *
    • .ToUtf8()转为 QByteArray
    • .Data() 转为 Char *
<2>按钮触发槽函数

点击按钮,触发下课:(注意语法)

connect(btn,&QPushButton::clicked,this,&Widget::classIsOver);

注意:

click是槽

clicked是信号

<3>信号连接信号

在这里插入图片描述

<4>断开信号

断开信号 disconnect

(3)拓展

<1>信号可以连接信号

<2>一个信号可以连接多个槽函数

<3>多个信号可以连接同一个槽函数

<4>信号和槽函数的参数必须类型一一对应

<5>信号的参数个数可以多于槽函数的参数个数(但是也要保证类型一一对应,注意顺序)

(信号的参数可以比槽函数多,可以理解为,A发出信号,但是接收方B不想理。

但是反过来不行,接收方B想要的参数,发送方A必须给,否则报错)

了解:

//Qt4版本以前的信号和槽连接方式
//利用Qt4信号槽 连接无参版本
//Qt4版本 底层SIGNAL(“hungry”) SLOT( “treat”)
connect(zt,SIGNAL(hungry()) , st , SLOT(treat()));
//Qt4版本优点:参数直观,缺点 :编译器对类型不做检测
//Qt5以上 支持 Qt4的版本写法,反之不支持

3.Lamba表达式

C++11中的Lambda表达式用于定义并创建匿名的函数对象,以简化编程工作

(1)基本构成:

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

在这里插入图片描述

注意

[],标识一个Lambda的开始,这部分必须存在,不能省略

例子:

在这里插入图片描述

注意:

最后加个括号,表示 “调用”,而不是 “声明“

例子:

在这里插入图片描述

总结:

函数对象参数有以下形式:(一般使用 ”=“ 就足够了,其他都很少用)

(1)。没有使用任何函数对象参数。

(2)=====。函数体内可以使用Lambda所在作用范围内所有可见的局部变量(包括Lambda所在类的this),并且是***值传递方式***(相当于编译器自动为我们按值传递了所有局部变量)。

(3) &。函数体内可以使用Lambda所在作用范围内所有可见的局部变量(包括Lambda所在类的this),并且是***引用传递方式***(相当于编译器自动为我们按引用传递了所有局部变量)。

(4) this函数体内可以使用Lambda所在类中的成员变量

(5)a。将a按值进行传递。按值进行传递时,函数体内不能修改传递进来的a的拷贝,因为默认情况下函数是const的。要修改传递进来的a的拷贝,可以添加mutable修饰符。


mutable关键字:

在这里插入图片描述


例子:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zZgCq7SJ-1596024040822)(C:\Users\w1396\AppData\Roaming\Typora\typora-user-images\image-20200726150311489.png)]

一个信号可以连接多个槽函数(使用lambda表达式的优势,比较方便):

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UXkuZfLh-1596024040825)(C:\Users\w1396\AppData\Roaming\Typora\typora-user-images\image-20200726150519386.png)]

4. 信号与槽总结(思维导图)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TBZzGa6f-1596024040834)(C:\Users\w1396\AppData\Roaming\Typora\typora-user-images\image-20200726151325965.png)]

六、QMainWindow

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2l2DQwFi-1596024040852)(C:\Users\w1396\AppData\Roaming\Typora\typora-user-images\image-20200726152949539.png)]

1. 菜单栏

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UnUwYvfI-1596024040855)(C:\Users\w1396\AppData\Roaming\Typora\typora-user-images\image-20200726160848579.png)]

菜单栏meanBar()不用设置this,因为它是系统默认的,所以同时它也不用new(区别于工具栏)

只能有一个,所以是setMenuBar(bar),只能set一次

2. 工具栏

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-92Hn2yGT-1596024040860)(C:\Users\w1396\AppData\Roaming\Typora\typora-user-images\image-20200726161057622.png)]

工具栏QToolBar(this) 需要设置this,同时也要new

补充:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R1HPput3-1596024040864)(C:\Users\w1396\AppData\Roaming\Typora\typora-user-images\image-20200726162222527.png)]

工具栏可以有多个,所以是addToolBar( … ),可以add多个

3.状态栏

在这里插入图片描述

状态栏statusBar()不用设置this,因为它是系统默认的,所以同时它也不用new(区别于工具栏)

只能有一个,所以是setStatusBar(stBar),只能set一次

标签控件:

需要new(类似 ”按钮控件“),也需要设置parent,(this)

4.铆接部件(浮动窗口)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Auivaq88-1596024040883)(C:\Users\w1396\AppData\Roaming\Typora\typora-user-images\image-20200726162806426.png)]

需要new,需要设置parent,(this)。因为它是部件(控件)

铆接部件可以有多个,所以是addDockWidget( … ),可以add多个

5. 设置中心部件(核心部件)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-77kk4Kw5-1596024040916)(C:\Users\w1396\AppData\Roaming\Typora\typora-user-images\image-20200726163233011.png)]

只能有一个,所以是seCentralWidget(edit),只能set一次

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zog2cRi3-1596024040922)(C:\Users\w1396\AppData\Roaming\Typora\typora-user-images\image-20200726163317242.png)]

6. 资源文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-knpMgSZH-1596024040923)(C:\Users\w1396\AppData\Roaming\Typora\typora-user-images\image-20200726172436958.png)]

注:使用相对路径

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LvcvnIfz-1596024040936)(C:\Users\w1396\AppData\Roaming\Typora\typora-user-images\image-20200726172354636.png)]

1.1 将图片文件 拷贝到项目位置下

1.2 右键项目->添加新文件 –> Qt - > Qt recourse File - >给资源文件起名

1.3 res 生成 res.qrc

1.4 open in editor 编辑资源

1.5 添加前缀 添加文件

1.6 使用 “ : + 前缀名 + 文件名

七、对话框 QDialog

1. 基本概念

对话框通常会是一个顶层窗口,出现在程序最上层,用于实现短期任务或者简洁的用户交互

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

  • 顶层窗口:在任务栏会有自己的位置;

  • 非顶层窗口:则会共享其父组件的位置

下面的演示例子用到了lambda表达式

2.模态对话框

不可以对其他窗口进行操作(阻塞同一应用程序中其它窗口的输入)

  • 使用QDialog::exec()实现 应用程序级别 的模态对话框

  • 使用QDialog::open()实现 窗口级别 的模态对话框

窗口级别的模态依然允许用户与程序中其它窗口交互,窗口级别的模态尤其适用于多窗口模式

一般默认是 ” 应用程序级别的模态 “

例子:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lqwiOvlk-1596024040941)(C:\Users\w1396\AppData\Roaming\Typora\typora-user-images\image-20200726191506748.png)]

exec()相当于阻塞

3. 非模态对话框

可以对其他窗口进行操作

  • 使用QDialog::show()实现 非模态对话框

例子:

注:

QDialog dialog(this)的方式,dialog是建立在上的(立刻消失)

QDialog *dialog=new QDialog;的方式,dialog是建立在上的(不会立刻消失),防止一闪而过

例子:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XKB4yP69-1596024040947)(C:\Users\w1396\AppData\Roaming\Typora\typora-user-images\image-20200726191423316.png)]

dlg2->setAttribute(Qt::WA_DeleteOnClose);//55号 属性 //避免内存泄漏

4.消息对话框(是 模态对话框)

(1)错误对话框
//消息对话框
    //错误对话框
    QMessageBox::critical(this,"critical","错误");
(2)信息对话框
//信息对话框
    QMessageBox::information(this,"info","信息");
(3)提问对话框
//提问对话框
//参数1  父亲  参数2  标题  参数3  提示内容  参数4 按键类型  参数5 默认关联回车按键
//QMessageBox::question 返回的类型是StandardButton,也是一个按键
    if (QMessageBox::Save  ==  QMessageBox::question(this,"ques","提问",QMessageBox::Save|QMessageBox::Cancel,QMessageBox::Cancel))
    {
   
        qDebug() << "选择的是保存";

    }
    else
    {
   
        qDebug() << "选择的是取消";
    }

(4)警告对话框
//警告对话框
    QMessageBox::warning(this,"warning","警告");
(5)总结

1.1 标准对话框 – 消息对话框

​ 1.1.1 QMessageBox 静态成员函数 创建对话框

​ 1.1.2 错误、信息、提问、警告

​ 1.1.3 参数1 父亲 参数2 标题 参数3 显示内容 参数4 按键类型 参数5 默认关联回车按键

​ 1.1.4 返回值 也是StandardButton类型,利用返回值判断用户的输入

5. 其他标准对话框

(1)颜色对话框 QColorDialog::getColor

返回值QColor

//颜色对话框
//QColor color =  QColorDialog::getColor();//无参,默认(255,255,255)
QColor color =  QColorDialog::getColor(QColor(255,0,0));
qDebug() << "r = " << color.red() << " g = " << color.green() << " b  = " << color.blue() ;//打印R,G,B的值

(2)文件对话框 QFileDialog::getOpenFileName

QFileDialog::getOpenFileName(父亲,标题,默认路径,过滤文件)

返回值QString

 //文件对话框  参数 1  父亲  参数2  标题   参数3  默认打开路径  参数4  过滤文件格式
 //返回值是 选取的路径
QString str = QFileDialog::getOpenFileName(this,"打开文件","C:\\Users\\w1396\\Desktop","(*.txt)");
qDebug() << str;

(3)字体对话框 QFontDialog::getFont

返回值QFont

 //字体对话框
 bool flag;
 QFont font = QFontDialog::getFont(&flag,QFont
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值