当前位置: 首页 > news >正文

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;
});

相关文章:

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

1.qt概述 1.什么是qt Qt 是一个跨平台的 C 图形用户界面应用程序框架。它为应用程序开发者提供建立艺 术级图形界面所需的所有功能。它是完全面向对象的&#xff0c;很容易扩展&#xff0c;并且允许真正的组 件编程。 2.支持的平台 Windows – XP 、 Vista 、 Win7 、 Win8…...

Kafka(一)在WSL单机搭建Kafka伪集群

目录 1 运行Kafka单实例1.1 Windws1.1.1 安装包下载1.1.2 修改环境变量1.1.3 修改配置文件1.1.4 启动Kafka单机版 1.2 Linux1.2.1 安装包下载1.2.2 创建目录1.2.3 添加环境变量1.2.4 修改配置文件1.2.5 运行Kafka1.2.6 停止Kafka 2 搭建Kafka集群2.1 搭建Zookeeper集群2.2 搭建…...

centos7 keepalived 探测哪个是当前节点

前提 nginx 默认页面内容中需要加上各节点的ip nginx web页面修改 nginx配置文件路径&#xff1a;/etc/nginx/nginx.conf&#xff0c;该配置文件引用了/etc/nginx/conf.d/default.conf 打开/etc/nginx/conf.d/default.conf配置文件可以看到html页面的路径 /usr/share/nginx…...

【iOS】数据持久化(二)之归档和解档(iOS 13以后)

在之前介绍的数据存储方法中&#xff0c;不管是NSUserDefaults还是plist文件都不能对自定义对象进行存储&#xff0c;OC提供的解归档恰好解决了这个问题 本片文章对 iOS13 以后的版本 归档和解档 进行介绍。老版本的解归档见这篇文章&#xff1a;【iOS】文件&#xff08;对象数…...

OpenHarmony模块化编译

一、环境配置 OpenHarmony版本&#xff1a;OpenHarmony 4.0 Release 编译环境&#xff1a;WSL2 Ubuntu 18.04 平台设备&#xff1a;RK3568 二、配置hb OpenHarmony 代码构建有build.sh和hb两种方式: #方式一、build.sh ./build.sh --product-name rk3568 --ccache#方式二、…...

Java游戏制作——王者荣耀

一.准备工作 首先创建一个新的Java项目命名为“王者荣耀”&#xff0c;并在src下创建两个包分别命名为“com.sxt"、”com.stx.beast",在相应的包中创建所需的类。 创建一个名为“img”的文件夹来储存所需的图片素材。 二.代码呈现 package com.sxt;import javax.sw…...

C# List<T>的综合用法

1、测试数据 //测试数据string str "";List<byte[]> bytes new List<byte[]>();for(int i0;i<10;i){byte[] bnew byte[2];b[0] (byte)(2 * i);b[1] (byte)(2 * i1);bytes.Add(b);str b[0] " " b[1] " ";}Console.WriteL…...

蓝桥杯-01简介

文章目录 蓝桥杯简介参考资源蓝桥杯官网第15届大赛章程一、概况&#xff08;一&#xff09;大赛背景和宗旨&#xff08;二&#xff09;大赛特色&#xff08;三&#xff09;大赛项目1.Java软件开发2.C/C程序设计3.Python程序设计4.Web应用开发5.软件测试6.网络安全7.嵌入式设计与…...

Spring的依赖注入,依赖注入的基本原则,依赖注入的优势

文章目录 Spring的依赖注入依赖注入的基本原则依赖注入有什么优势查找定位操作与应用代码完全无关。有哪些不同类型的依赖注入实现方式&#xff1f;构造器依赖注入和 Setter方法注入的区别 Spring的依赖注入 控制反转IoC是一个很大的概念&#xff0c;可以用不同的方式来实现。…...

Git远程仓库常用开发命令和理解

远程仓库 创建与合并分支 每次提交&#xff0c;Git都把它们串成一条时间线&#xff0c;这条时间线就是一个分支。截止到目前&#xff0c;只有一条时间线&#xff0c;在Git里&#xff0c;这个分支叫主分支&#xff0c;即master分支。 HEAD严格来说不是指向提交&#xff0c;而…...

Unknown error 1054

MySQL错误1054是“Unknown column”的错误&#xff0c;意味着在查询或语句中引用了一个不存在的列名。这通常是因为在查询中指定了一个不存在的列名。 解决步骤&#xff1a; 检查列名的拼写&#xff1a;确保在查询或语句中正确地输入了列名。检查大小写&#xff0c;确保与数据…...

pandas教程:Interfacing Between pandas and Model Code pandas与建模代码间的交互

文章目录 Chapter13 Introduction to Modeling Libraries in Python&#xff08;Python中建模库的介绍&#xff09;13.1 Interfacing Between pandas and Model Code&#xff08;pandas与建模代码间的交互&#xff09; Chapter13 Introduction to Modeling Libraries in Python…...

鸿蒙应用开发-初见:ArkTS

作者&#xff1a;HarderCoder ArkTS ArkTS围绕应用开发在 TypeScript &#xff08;简称TS&#xff09;生态基础上做了进一步扩展&#xff0c;继承了TS的所有特性&#xff0c;是TS的超集 ArkTS在TS的基础上扩展了struct和很多的装饰器以达到描述UI和状态管理的目的 基本语法 …...

HTTP 和 HTTPS 之间除了安全性区别外,还有哪些区别

HTTP 和 HTTPS 是两种常见的网络协议&#xff0c;它们都是用于在浏览器和服务器之间传输数据的。但是&#xff0c;它们之间也有一些重要的区别&#xff0c;这些区别涉及到数据的安全性、传输性能、使用成本和搜索排名等方面。本文将从以下几个方面来介绍 HTTP 和 HTTPS 的区别&…...

小内存服务器生存指南 ——SWAP 虚拟内存

人们常说,网络是服务器的生命线,没有了网络,服务器再怎么牛逼,都跑不起来。然而偏偏有这么一票的服务器,它的网络很好,CPU 也很好,就是内存有点小。他们是主机界的独行侠 —— 入门级 VPS 服务器。 前俩天买的一台 TMT 的服务器就是这个类型: 256M 内存CPU 1vCore (2.…...

Linux 内存管理中的 Buffers 和 Cached:理解和区分

引言 当涉及到 Linux 系统的内存管理时&#xff0c;“Buffers” 和 “Cached” 是两个经常会引起混淆的术语。这两个概念都代表了系统内存的一部分&#xff0c;但它们的作用和工作方式有所不同。 区别&#xff1a; Buffers&#xff1a; Buffers&#xff08;缓冲区&#xff0…...

Linux——使用命令查看文件和文件夹数量

目录 一、相关命令参数解析二、查看当前目录下的文件数量2.1 包含子目录中的文件2.2 不包含子目录中的目录 三、查看当前目录下的文件夹个数3.1 不包含目录中的目录3.2 包含目录中的目录 四、查看当前文件夹下叫某某的文件的数量实例 五、总结 一、相关命令参数解析 "&qu…...

[蓝桥杯训练]———高精度乘法、除法

高精度乘法、除法 一、高精度乘法⭐1.1 初步理解1.1.1 高精度的定义1.1.2 为什么会有高精度1.1.3 高精度乘法的复杂度 1.2 思想讲解1.3 代码实现1.3.1 声明1.3.2 实现高精度乘法1.3.3 整体实现1.3.4 代码测试 二、高精度除法⭐2.1 初步理解2.2 思想讲解2.3 代码实现2.3.1 声明2…...

使用javascript 点击tab栏切换事件代码记录

如下图实现以下两点功能&#xff1a; 这里做代码记录 1. javascript 点击tab栏动态切换内容&#xff0c;并添加active 2. javascript 点击左右图标可以向左或者向右移动元素 第1点功能&#xff1a; // tab栏 <div class"left"><span class"tab act…...

零基础编程入门视频教程,零基础编程从哪学起,分享中文编程工具构件实例

零基础编程入门视频教程&#xff0c;零基础编程从哪学起&#xff0c;分享中文编程工具构件实例 1、零基础编程入门视频教程&#xff0c;系统化编程教程链接 https://jywxz.blog.csdn.net/article/details/134073098?spm1001.2014.3001.5502 2、零基础编程从哪学起 建议初学…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

深度学习习题2

1.如果增加神经网络的宽度&#xff0c;精确度会增加到一个特定阈值后&#xff0c;便开始降低。造成这一现象的可能原因是什么&#xff1f; A、即使增加卷积核的数量&#xff0c;只有少部分的核会被用作预测 B、当卷积核数量增加时&#xff0c;神经网络的预测能力会降低 C、当卷…...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战&#xff0c;克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

LangChain 中的文档加载器(Loader)与文本切分器(Splitter)详解《二》

&#x1f9e0; LangChain 中 TextSplitter 的使用详解&#xff1a;从基础到进阶&#xff08;附代码&#xff09; 一、前言 在处理大规模文本数据时&#xff0c;特别是在构建知识库或进行大模型训练与推理时&#xff0c;文本切分&#xff08;Text Splitting&#xff09; 是一个…...

聚六亚甲基单胍盐酸盐市场深度解析:现状、挑战与机遇

根据 QYResearch 发布的市场报告显示&#xff0c;全球市场规模预计在 2031 年达到 9848 万美元&#xff0c;2025 - 2031 年期间年复合增长率&#xff08;CAGR&#xff09;为 3.7%。在竞争格局上&#xff0c;市场集中度较高&#xff0c;2024 年全球前十强厂商占据约 74.0% 的市场…...