QT Day01 qt概述,创建项目,窗口属性,按钮,信号与槽

1.qt概述

1.什么是qt

        Qt 是一个跨平台的 C++ 图形用户界面应用程序框架。它为应用程序开发者提供建立艺
术级图形界面所需的所有功能。它是完全面向对象的,很容易扩展,并且允许真正的组
件编程。

2.支持的平台

Windows – XP Vista Win7 Win8 Win2008 Win10
Uinux/X11 – Linux Sun Solaris HP-UX Compaq Tru64 UNIX IBM AIX
SGI IRIX FreeBSD BSD/OS 、和其他很多 X11 平台
Macintosh – Mac OS X
Embedded – 有帧缓冲支持的嵌入式 Linux 平台, Windows CE
3.安装
见之前博客

2.创建项目

创建项目

步骤一:选择新建

步骤二:选择application项目

3.填写项目名称和存储路径位置

如图所示

3.工程.pro文件说明

# 添加源信息: core 核心源码, gui 图形化源码
QT + = core gui
# 如果 Qt 版本大于 4, QT 添加 widgets 组件库
greaterThan(QT_MAJOR_VERSION, 4) : QT + = widgets
# 生成的 .exe 文件名
TARGET = demo01
# 模板类型 ,app 表示应用程序模板
TEMPLATE = app
# 使用 c++11 标准
# g++ -std=c++11
CONFIG + = c++11
# Qt 过时警告
DEFINES + = QT_DEPRECATED_WARNINGS
# cpp 的源文件 【重要】
SOURCES + = \
main.cpp \
widget.cpp
# 头文件 【重要】
HEADERS + = \
widget.h
# 编译时输出的可执行程序的名称
TARGET = hello
# 部署安装时的选项, qnx 是嵌入式的操作系统的名称
qnx : target.path = /tmp/$${TARGET}/bin
# 如果不是 qnx ,是 unix Android , 安装的目标位置是 /opt/../bin
else : unix : !android : target.path = /opt/$${TARGET}/bin
# 如果 target.path 路径非空时,则设置安装路径
!isEmpty(target.path): INSTALLS += target

4.窗口属性

this->resize(800,600);  //设置窗口大小( 1 : 宽度, 2 : 高度)
this->setWindowTitle(" 德玛西亚"); // 设置窗口标题
this->setFixedSize(800,600);// 设置窗口大小不可改变
this->setWindowicon(Qicon("图片文件路径"));//设置窗口图标
this->setText("");//设置文本信息
this->Text();//获取文本信息

5.按钮Qpushbutton

方式一:代码创建

#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>//1,引入按钮所需头文件
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{ui->setupUi(this);//设置窗口大小//1参:宽度//2参:高度this->resize(800,600);//设置窗口标题this->setWindowTitle("德玛西亚");//设置窗口大小不可改变this->setFixedSize(800,600);//2,创建按钮对象QPushButton* btn = new QPushButton;//3,设置按钮的父容器btn->setParent(this);//4,设置位置btn->move(100,100);//5,设置文本btn->setText("登录");}
Widget::~Widget()
{delete ui;
}
方式 2: 图形界面开发

6.信号与槽机制

1.注意

        核心在于发送者与接受者
        发送者可以发出多种信号, 被多个不同的接收者接收
        接收者有多个槽函数, 接收不同的发送者发出的信号

2.信号与槽的连接

connect()函数
        connect(sender, signal, receiver, slot)
        sender:发送者
        signal:发出的信号
        receiver:接受者
        slot:槽函数
示例1
        //ui文件中名为 btnclose 的按钮发出点击信号
        //被当前窗口接收,执行关闭窗口的操作
        //qt5的写法
        //connect(ui->btnclose,&QPushButton::clicked,this,&Widget::close);
        //qt4的写法
        connect(ui->btnclose,SIGNAL(clicked(bool)),this,SLOT(close()));
        示例2
        //信号与槽函数有参数
        //qt5的写法
        //void (QPushButton:: *cli_p)(bool) = &QPushButton::clicked;
        //void (Widget:: *myfun_p)(bool) = &Widget::myfun;
        //connect(ui->btnclose,cli_p,this,myfun_p);
        //qt4的写法
        connect(ui->btnclose,SIGNAL(clicked(bool)),this,SLOT(myfun(bool)));

系统提供的信号与槽

QWidget 提供
信号:
void customContextMenuRequested(const QPoint &pos) // 请求上下文菜单时
void windowIconChanged(const QIcon &icon) // 窗口图标改变时
void windowTitleChanged(const QString &title) // 窗口标题改变时
槽:
bool close() // 关闭
void hide() // 隐藏
void lower()
void raise()
void repaint() // 重新加载
void setDisabled(bool disable)
void setEnabled(bool)
void setFocus()
void setHidden(bool hidden)
void setStyleSheet(const QString &styleSheet)
virtual void setVisible(bool visible)
void setWindowModified(bool)
void setWindowTitle(const QString &)
void show() // 显示
void showFullScreen() // 全屏显示
void showMaximized() // 最大化显示
void showMinimized() // 最小化显示
void showNormal()
void update()
QPushButton 提供
信号:
void clicked(bool checked = false) // 点击信号
void pressed() // 按钮按下信号 (按下)
void released() // 按钮释放信号(抬起)
void toggled(bool checked) // 触发(开或关)

自定义信号与槽

注意事项:

1, 发送者和接收者都需要是 QObject 的子类(当然,槽函数是全局函数、 Lambda 表达
式等无需接收者的时候除外)
2, 信号和槽函数返回值类型是 void
3, 信号只需要声明 , 不需要实现
4, 槽函数需要声明也需要实现
5, 槽函数是普通的成员函数,作为成员函数,会受到 public private protected
的影响;
6, 使用 emit 在恰当的位置发送信号 ;
7, 使用 connect() 函数连接信号和槽。
8, 任何成员函数、 static 函数、全局函数和 Lambda 表达式都可以作为槽函数
9, 信号槽要求信号和槽的参数一致,所谓一致,是参数类型一致。
10, 如果信号和槽的参数不一致,允许的情况是,槽函数的参数可以比信号的少,即便
如此,槽函数存在的那些参数的顺序也必须和信号的前面几个一致起来。这是因为,你
可以在槽函数中选择忽略信号传来的数据(也就是槽函数的参数比信号的少)。
案例 : 下课了 , 老师饿了 , 学生请吃饭

信号槽拓展

1,一个信号可以和多个槽相连
        槽会一个接一个的被调用,但是它们的调用顺序是不确定
示例:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPushButton>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{ui->setupUi(this);QPushButton* btn = new QPushButton(this);btn->setText("按钮");void (QPushButton:: *cli_p)(bool) = &QPushButton::clicked;connect(btn,cli_p,this,&MainWindow::fun01);connect(btn,cli_p,this,&MainWindow::fun02);connect(btn,cli_p,this,&MainWindow::fun03);
}
MainWindow::~MainWindow()
{delete ui;
}
void MainWindow::fun01()
{qDebug() << "fun0111111" << endl;
}
void MainWindow::fun02()
{qDebug() << "fun0222222" << endl;
}
void MainWindow::fun03()
{qDebug() << "fun0333333" << endl;
}
2,多个信号可以连接到一个槽
        只要任意一个信号发出,这个槽就会被调用
示例:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPushButton>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{ui->setupUi(this);QPushButton* btn1 = new QPushButton(this);btn1->setText("按钮1");QPushButton* btn2 = new QPushButton(this);btn2->setText("按钮2");btn2->move(0,50);void (QPushButton:: *cli_p)(bool) = &QPushButton::clicked;connect(btn1,cli_p,this,&MainWindow::fun01);connect(btn2,cli_p,this,&MainWindow::fun01);
}
MainWindow::~MainWindow()
{delete ui;
}
void MainWindow::fun01()
{qDebug() << "fun0111111" << endl;
}
3,一个信号可以连接到另外的一个信号
        当第一个信号发出时,第二个信号被发出。除此之外,这种信号- 信号的形式和信号 -
的形式没有什么区别。
示例:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPushButton>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{ui->setupUi(this);QPushButton* btn = new QPushButton(this);btn->setText("按钮");void (QPushButton:: *cli_p)(bool) = &QPushButton::clicked;connect(btn,cli_p,this,&MainWindow::mySignal);connect(this,&MainWindow::mySignal,this,&MainWindow::fun01);
}
MainWindow::~MainWindow()
{delete ui;
}
void MainWindow::fun01()
{qDebug() << "fun0111111" << endl;
}
4,信号槽可以断开
        利用 disconnect 关键字是可以断开信号槽的
示例:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPushButton>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{ui->setupUi(this);QPushButton* btn = new QPushButton(this);btn->setText("按钮");void (QPushButton:: *cli_p)(bool) = &QPushButton::clicked;connect(btn,cli_p,this,&MainWindow::fun01);//断开信号与槽的连接btn->disconnect(this);
}
MainWindow::~MainWindow()
{delete ui;
}
void MainWindow::fun01()
{qDebug() << "fun0111111" << endl;
}
5,槽可以被取消链接
        这种情况并不经常出现,因为当一个对象 delete 之后, Qt 自动取消所有连接到这个
对象上面的槽
6.使用lambda表达式
        在使用 Qt 5 的时候,能够支持 Qt 5 的编译器都是支持 Lambda 表达式的。

Lambda表达式

c++11 提出 lambda 表达式
作用 : 简化代码
语法:
[ 函数对象参数 ]( 操作符重载函数参数 ) mutable -> 返回值 { 函数体 }
        []:lambda表达式符号 , 可以啥都不写 , 不能省略
        函数对象参数
                空 没有使用任何函数对象参数
                = 可以访问外部变量只能读
                a,b 能对lambda 外的 a,b 变量读操作
                & lambda外的变量读写操作
                a,&b 对外部的a b 读写
                this 函数体内可以使用 Lambda 所在类中的成员变量
(): 形参列表

示例1:不使用外部变量

connect(btn03,&QPushButton::clicked,[](){
qDebug()<< " , 不闹 " << endl;
});

示例2.使用外部指定变量

int x=100;
connect(btn2, &QPushButton::clicked, [x]() mutable{
// x 在函数内部是 const 修饰的,除非去掉 const ,加 mutable 关键字
x++;
qDebug() << x << endl;
});

示例3:同时传递多个变量或变量的引用

int x=100;
int y=90;
connect(btn2, &QPushButton::clicked, [x, &y]() mutable{
// x 在函数内部是 const 修饰的,除非去掉 const ,加 mutable 关键字
x++;
qDebug() << x <<","<< y << endl;
});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/186564.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java(119):ExcelUtil工具类(org.apache.poi读取和写入Excel)

ExcelUtil工具类(XSSFWorkbook读取和写入Excel),入参和出参都是:List<Map<String,Object>> 一、读取Excel testdata.xlsx 1、new XSSFWorkbook对象 File file = new File(filePath); FileInputStream fis = new FileInputStream(file);…

8.二维数组——将一个二维数组行和列的元素互换,存到另一个二维数组中。

文章目录 前言一、题目描述 二、题目分析 三、解题 程序运行代码 前言 本系列为二维数组编程题&#xff0c;点滴成长&#xff0c;一起逆袭。 一、题目描述 将一个二维数组行和列的元素互换&#xff0c;存到另一个二维数组中。 二、题目分析 三、解题 程序运行代码 #incl…

玄学调参实践篇 | 深度学习模型 + 预训练模型 + 大模型LLM

&#x1f60d; 这篇主要简单记录一些调参实践&#xff0c;无聊时会不定期更新~ 文章目录 0、学习率与batch_size判断1、Epoch数判断2、判断模型架构是否有问题3、大模型 - 计算量、模型、和数据大小的关系4、大模型调参相关论文经验总结5、训练时模型的保存 0、学习率与batch_s…

压力测试+接口测试

jmeter是apache公司基于java开发的一款开源压力测试工具&#xff0c;体积小&#xff0c;功能全&#xff0c;使用方便&#xff0c;是一个比较轻量级的测试工具&#xff0c;使用起来非常简单。因 为jmeter是java开发的&#xff0c;所以运行的时候必须先要安装jdk才可以。jmeter是…

鸿蒙系统开发手册 - HarmonyOS内核驱动层源码分析

众所周知系统定义HarmonyOS是一款“面向未来”、面向全场景&#xff08;移动办公、运动健康、社交通信、媒体娱乐等&#xff09;的分布式操作系统。在传统的单设备系统能力的基础上&#xff0c;HarmonyOS提出了基于同一套系统能力、适配多种终端形态的分布式理念&#xff0c;能…

Arrays.asList() 与 Collections.singletonList()的恩怨情仇

1. 概述 列表是我们使用 Java 时常用的集合类型。 众所周知&#xff0c;我们可以轻松地用一行初始化一个List。例如&#xff0c;当我们想要初始化一个只有一个元素的List时&#xff0c;我们可以使用Arrays.asList()方法或Collections.singletonList()方法。 在本文中&#x…

【Linux】基础IO--文件基础知识/文件操作/文件描述符

文章目录 一、文件相关基础知识二、文件操作1.C语言文件操作2.操作系统文件操作2.1 比特位传递选项2.2 文件相关系统调用2.3 文件操作接口的使用 三、文件描述符fd1.什么是文件描述符2.文件描述符的分配规则 一、文件相关基础知识 我们对文件有如下的认识&#xff1a; 1.文件 …

用最少数量的箭引爆气球[中等]

优质博文&#xff1a;IT-BLOG-CN 一、题目 有一些球形气球贴在一堵用XY平面表示的墙面上。墙面上的气球记录在整数数组points&#xff0c;其中points[i] [xstart, xend]表示水平直径在xstart和xend之间的气球。你不知道气球的确切y坐标。一支弓箭可以沿着x轴从不同点完全垂直…

Panalog 日志审计系统 前台RCE漏洞复现

0x01 产品简介 Panalog是一款日志审计系统&#xff0c;方便用户统一集中监控、管理在网的海量设备。 0x02 漏洞概述 Panalog日志审计系统 sy_query.php接口处存在远程命令执行漏洞&#xff0c;攻击者可执行任意命令&#xff0c;接管服务器权限。 0x03 复现环境 FOFA&#xf…

谭巍主任专业角度解读:疣体脱落前的症状是什么?

我们时常会发现身体各个部位长出一些赘生物&#xff0c;有些属于皮肤良性改变&#xff0c;而有些则是病毒引起的&#xff0c;称之为疣体。然而在疣体脱落之前&#xff0c;通常会出现一些症状&#xff0c;这些症状可能因人而异&#xff0c;但以下是一些常见的迹象&#xff1a; 1…

笔记61:注意力提示

本地笔记地址&#xff1a;D:\work_file\&#xff08;4&#xff09;DeepLearning_Learning\03_个人笔记\3.循环神经网络\第10章&#xff1a;动手学深度学习~注意力机制 a a a a a a a a

MySQL索引使用总结

索引(index) 官方定义&#xff1a;一种提高MySQL查询效率的数据结构 优点&#xff1a;加快查询速度 缺点&#xff1a; 1.维护索引需要消耗数据库资源 2.索引需要占用磁盘空间 3.增删改的时候会影响性能 索引分类 索引和数据库表的存储引擎有关&#xff0c;不同的存储引擎&am…

AndroidStudio - 新版本 Logcat 使用详解

最近这俩天正好有时间给自己做一下减法&#xff0c;忘记是去年还是今年&#xff0c;在升级 AndroidStudio 后使用 Logcat查看日志的方式也发生了一些变化&#xff0c;虽然一直在使用&#xff0c;但每当看到之前还未关闭 Logcat 命令行工具额昂也&#xff0c;就感觉可能还存在知…

Multi-head attention机制

多头&#xff1a;多个相同结构的线性变换层&#xff08;方阵&#xff09;&#xff0c;要求分别线性变换 B站教学视频参考&#xff1a;https://www.bilibili.com/video/BV1eG4y1N7Jp/?p17&spm_id_frompageDriver&vd_sourcef4c7dcac0ad5ae8189bd414a3b23020d 什么是多头…

冒泡排序算法是对已知的数列进行从小到大的递增排序。

题目描述冒泡排序算法是对已知的数列进行从小到大的递增排序每个实例输出两行&#xff0c;第一行输出第1轮结果, 第二行输出最终结果 它的排序方法如下: 1.对数列从头开始扫描&#xff0c;比较两个相邻的元素,如果前者大于后者,则交换两者位置 2.重复步骤1&#xff0c;直到没有…

RocketMQ源码剖析之createUniqID方法

目录 版本信息&#xff1a; 写在前面&#xff1a; 源码剖析&#xff1a; 总计&#xff1a; 版本信息&#xff1a; RocketMQ-5.1.3 源码地址&#xff1a;https://github.com/apache/rocketmq 写在前面&#xff1a; 首先&#xff0c;笔者先吐槽一下RocketMQ的官方&#xff0…

attention中Q,K,V的理解

第一种 1.首先定义三个线性变换矩阵&#xff0c;query&#xff0c;key&#xff0c;value&#xff1a; class BertSelfAttention(nn.Module):self.query nn.Linear(config.hidden_size, self.all_head_size) # 输入768&#xff0c; 输出768self.key nn.Linear(config.hidde…

上海线下活动 | LLM 时代的 AI 编译器实践与创新

今年 3 月份&#xff0c; 2023 Meet TVM 系列首次线下活动从上海出发&#xff0c;跨越多个城市&#xff0c;致力于为各地关注 AI 编译器的工程师提供一个学习、交流的平台。 12 月 16 日 2023 Meet TVM 年终聚会将重返上海&#xff0c;这一次我们不仅邀请了 4 位资深的 AI 编…

自动伸缩:解密HPA、VPA、CA和CPA智能调整应用大小和数量

关注【云原生百宝箱】公众号&#xff0c;快速掌握云原生 Kubernetes提供了多种自动伸缩机制&#xff0c;例如HPA&#xff08;Horizontal Pod Autoscaling&#xff09;&#xff0c;可以根据不同情况动态调整Pod副本数量。此功能使 Pod 能够有效地处理当前流量&#xff0c;而无需…

pytorch中的激活函数详解

1 激活函数介绍 1.1 什么是激活函数 激活函数是神经网络中引入的非线性函数&#xff0c;用于捕获数据中的复杂关系。它来自动物界的灵感&#xff0c;动物的神经元会接受来自对它有作用的其他神经元的信号&#xff0c;当然这些信号对该神经元的作用大小不同&#xff08;即具有不…