qt开发从入门到实战2

news2024/12/26 13:21:47

以下是本人学习笔记
原视频:最新QT从入门到实战完整版|传智教育

qt开发从入门到实战1

练习示例

设计一个按钮,点击时弹出新窗口,再次点击时新窗口关闭

// exercise
   QWidget* second_window = new QWidget();
   QPushButton* btn3 = new QPushButton("open", this);
   btn3->move(0, 100);
   connect(btn3, &QPushButton::clicked, second_window, [=](){
       if(btn3->text() == "open"){
           second_window->show();
           second_window->resize(100, 100);
           btn3->setText("close");
       }else if(btn3->text() == "close"){
           second_window->close();
           btn3->setText("open");
       }
   });

注意:加入窗口和加入对象树是两个不同的概念

一、窗口中的基础部件

1.创建菜单栏

讲解见注释

// 创建菜单栏
// 菜单栏最多只有一个
// menuBar构造函数已经把自身加入对象树了
QMenuBar* bar = menuBar();
// 将菜单栏放入窗口
setMenuBar(bar);
// 创建菜单
QMenu* fileMenu = bar->addMenu("file");
QMenu* editMenu = bar->addMenu("edit");
// 创建菜单项
QAction* newAction = fileMenu->addAction("new");
// 添加分隔线
fileMenu->addSeparator();
QAction* openAction = fileMenu->addAction("open");

2.创建工具栏

// 工具栏可以有多个
QToolBar* toolBar = new QToolBar(this); // 加入对象树
// 加入窗口和加入对象树是两个不同的概念
addToolBar(Qt::LeftToolBarArea ,toolBar); // 加入窗口
// 设置工具栏是否可以移动(相当于总开关)
toolBar->setMovable(false);
// 设置工具栏只可以左右停靠
toolBar->setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea);
toolBar->setFloatable(false);
// 设置工具栏内容
// 相当于工具栏和菜单栏公用的功能
toolBar->addAction(newAction);
toolBar->addAction(openAction);
// 工具栏中添加控件
QPushButton* btn = new QPushButton("aa", this);
toolBar->addWidget(btn);

3.创建状态栏

// 状态栏最多只有一个
QStatusBar* stBar = statusBar();
// 将状态栏放入窗口
setStatusBar(stBar);
// 放标签控件
QLabel* label1 = new QLabel("tips", this);
stBar->addWidget(label1);
QLabel* label2 = new QLabel("right tips", this);
// right labels
stBar->addPermanentWidget(label2);

4.创建铆接部件(浮动窗口)+中心部件

// 创建铆接部件(浮动窗口):可以有多个
QDockWidget* dockWidget = new QDockWidget("float", this);
// 浮动窗口的位置是相对于核心部件的位置而言的(在核心部件的上/下/左/右)
addDockWidget(Qt::TopDockWidgetArea, dockWidget);
// 设置后期停靠区域:只允许上下
dockWidget->setAllowedAreas(Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea);

5.创建中心部件

// 设置中心部件:只有一个
QTextEdit* edit = new QTextEdit(this);
setCentralWidget(edit);

0.无代码版

创建项目时勾选创建ui界面,之后在ui中手动拖拽部件(手动狗头)
在这里插入图片描述

二、资源文件的添加

利用无代码方式进行控件的布局后,添加的部件在源文件中可以通过ui找到

  1. 寻找到项目文件位置,将需要用的资源放在项目文件夹中,代码里使用相对路径
  2. 在Qt项目中,右击项目->添加新文件
  3. 选择qt->qt resource file(最终生成.qrc文件)
  4. 命名后默认选项即可
  5. 添加前缀(仅作区分用)
  6. 添加文件:全选之前加入项目文件夹的图片即可

注意:

  1. 从res.qrc切出后,双击文件无法唤起页面,需要右击res.qrc->open in editor
  2. 图片资源必须得是png格式,不然会不显示图片

三、对话框

1.模态/非模态对话框

    // 点击新建按钮,弹出一个对话框
    connect(ui->newAction, &QAction::triggered, [=](){
        // 对话框分类
        // 1.模态对话框:不可以对其他窗口进行操作
        // 2.非模态对话框:可以对其他窗口进行操作
        // 模态创建(阻塞)
        QDialog dlg1(this);
        dlg1.resize(200, 100);
        // 在模态对话框关闭之前,程序会一直在此阻塞
        dlg1.exec();
        qDebug() << "模态创建";
    });

    connect(ui->openAction, &QAction::triggered, [=](){
        // 非模态对话框创建
        // 以下方式创建会让对话框在离开匿名函数时就被销毁
        // QDialog dlg2(this);
        // dlg2.show();
        // 将对话框创建在堆上即可
        QDialog* dlg2 = new QDialog(this);
        dlg2->resize(200, 100);
        dlg2->show();
        // 使其在关闭时删除对象(因为默认只有在主窗口关闭时,所有对象才会被销毁)
        dlg2->setAttribute(Qt::WA_DeleteOnClose);
        qDebug() << "非模态对话框创建";
    });

2.标准对话框

标准对话框是Qt内置的用于简化开发的一系列对话框
消息对话框

// 错误对话框
QMessageBox::critical(this, "critical", "error");
// 信息对话框
QMessageBox::information(this, "information", "some info");
// 提问对话框(父亲, 标题, 内容, 按钮类型, 与回车关联的按钮)
// 返回值是standarButton类型
if(QMessageBox::Save == QMessageBox::question(this, "question", "Q?", QMessageBox::Cancel | QMessageBox::Save, QMessageBox::Save))
{
   qDebug() << "save something";
}else
{
   qDebug() << "cancel";
}
// 警告对话框
QMessageBox::warning(this, "warning", "stop!");

tips:静态对象可以通过①创建对象访问②直接通过类名访问

其他对话框

// 其他对话框
// 文件对话框(parent, title, default path, filter file)
QString filePath = QFileDialog::getOpenFileName(this, "open files", "/home", "*.txt");
qDebug() << filePath;

// 字体对话框
bool flag;
QFont font = QFontDialog::getFont(&flag, QFont("console", 36));
qDebug() << font;

// 颜色对话框(上面两种有warning)
// QColor color = QColorDialog::getColor(QColor(255, 255, 255));
// QColor color = QColorDialog::getColor(Qt::red, this);
QColor color(0, 0, 0);
QColorDialog colorDialog(color, this);
colorDialog.setOption(QColorDialog::DontUseNativeDialog);
if( colorDialog.exec() == QDialog::Accepted )
{
    // 获取当前选中的颜色
    color = colorDialog.currentColor();
    qDebug() << color;
}

3.未完待续

p23

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

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

相关文章

兽药经营小程序微信商城的作用是什么

无论家宠还是畜牧养殖&#xff0c;生病杀虫总是不可少的&#xff0c;尤其对铲屎官们来说&#xff0c;宠物的健康状况很重要&#xff0c;以此花费百元千元也并不觉心疼&#xff0c;兽药的需求度也是非常高&#xff0c;那么对相关从业商家来说&#xff0c;遇到的难题有哪些&#…

淘宝大数据揭秘:购物狂欢节背后的秘密

淘宝详情接口是淘宝开放平台提供的一种API接口&#xff0c;主要用于获取淘宝商品详情信息。通过该接口&#xff0c;开发者可以在自己的网站或应用程序中快速获取淘宝商品的详细信息&#xff0c;包括价格、图片、商品描述等。 要使用淘宝详情接口&#xff0c;首先需要在淘宝开放…

[NISACTF 2022]babyserialize - 反序列化+waf绕过【*】

[NISACTF 2022]babyserialize 一、解题过程二、思考总结&#xff08;一&#xff09;、关于题目的小细节&#xff08;二&#xff09;、关于弱类型比较技巧 一、解题过程 题目代码&#xff1a; <?php include "waf.php"; class NISA{public $fun"show_me_fl…

java Spring Boot整合jwt实现token生成

先在 pom.xml 文件中注入依赖 <!-- JWT --> <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-api</artifactId><version>0.11.2</version> </dependency> <dependency><groupId>io.jsonw…

解决方案:AI赋能工业生产3.0,从工业“制造”到“智造”

视频监控技术是一种既成熟又广泛应用于工业制造领域的先进技术。它可以通过安装各种摄像头和传感器来监测整个生产流程&#xff0c;包括原材料的采购、加工、装配和物流等环节&#xff0c;从而实现对生产过程的实时监控和管理&#xff0c;以及对异常事件的及时预警和响应。 在…

CSS高手必会秘籍《混合模式》

&#x1fab4; 背景 前几天我写了两篇关于css的文章&#xff0c;热度都还不错。 # 原创动画《优弧&#xff0c;你小子&#xff01;&#x1f621;》 # &#x1f973;&#x1f973;&#x1f973; 倾情奉献&#xff0c;纯css&#xff08;无图&#xff0c;无JS&#xff09;原创中…

6.canvas绘制基本图形——椭圆

ellipse ellipse是一个用来绘制椭圆的api&#xff0c;它拥有8个参数 参数一&#xff1a;椭圆圆心的 x 轴坐标。 参数二&#xff1a;椭圆圆心的 y 轴坐标。 参数三&#xff1a;椭圆长轴的半径。 参数四&#xff1a;椭圆短轴的半径。 参数五&#xff1a;椭圆的顺时针旋转角度&am…

6.绘制三角形

愿你出走半生,归来仍是少年 上一个案例通过Buffer实现了点集合的传入并一次性绘制多个点。当前案例通过Buffer传入多个点&#xff0c;并一次性通过点绘制出一个三角形。 1.知识点 1.1.gl_PointSize 只有在绘制点时才有效&#xff0c;该案例中的顶点着色器中已移除此代码。 1…

学生必备的笔记工具比较适合用哪个

学习与笔记紧密相连&#xff0c;它们是知识获取和积累的有效途径。通过记录笔记&#xff0c;我们不仅可以更好地理解和记忆学习内容&#xff0c;还可以随时翻阅&#xff0c;巩固知识点。然而&#xff0c;传统的纸质笔记在面对大量学习内容时显得力不从心&#xff0c;而电子笔记…

查找文件夹下不同的图片名字

描述&#xff1a;文件夹1和文件夹2下有3张图片&#xff0c;其中文件夹1下有柯南.jpg、柯南1.jpg、柯南2.jpg&#xff0c;文件夹2下有柯南.jpg、柯南3.jpg、柯南4.jpg&#xff0c;找出文件夹1中不同于文件夹2的名字&#xff0c;以及文件夹2中不同于文件夹1的名字。文件解构如下图…

uni-app:引入echarts(使用renderjs)

效果 代码 <template><view click"echarts.onClick" :prop"option" :change:prop"echarts.updateEcharts" id"echarts" class"echarts"></view> </template><script>export default {data()…

【源码】hamcrest 源码阅读 空对象模式、模板方法模式的应用

文章目录 前言1. 类图概览2. 源码阅读2.1 抽象类 BaseMatcher2.1 接口 Description提炼模式&#xff1a;空对象模式 2. 接口 Description 与 SelfDescribing 配合使用提炼模式 模板方法 后记 前言 hamcrest &#xff0c;一个被多个测试框架依赖的包。听说 hamcrest 的源码质量…

【芯片设计- RTL 数字逻辑设计入门 4 - 第一个 RTL Bug 分析之路 】

文章目录 1.1 Veloce 验证1.1.1 问题背景1.1.2 问题分析1.1.3 调试小技巧 1.1 Veloce 验证 本文是基于veloce验证平台进行的&#xff0c;关于veloce的介绍如下&#xff1a; 传统的验证技术中,主要采用两种手段。 一种是基于EDA工具(Simulator)的仿真验证。这种验证方式是基于…

谈谈你对 finalize 方法的理解,该怎样回答才能体现出高水平?浮于表面的答案永远不行!

目录 1. finalize 方法是什么&#xff1f; 2. finalize 方法的作用&#xff1f; 3. 为什么强烈不建议在 finalize 方法中进行资源的释放和清理工作 1. finalize 方法是什么&#xff1f; 首先要知道&#xff0c;finalize 方法是 Object 类中的一个方法&#xff0c;从源码中叶…

ES6 class类的静态方法static有什么用

在项目中&#xff0c;工具类的封装经常使用静态方法。 // amap.jsimport AMapLoader from amap/amap-jsapi-loader; import { promiseLock } from triascloud/utils; /*** 高德地图初始化工具*/ class AMapHelper {static getAMap window.AMap? window.AMap: promiseLock(AM…

[PyTorch][chapter 56][GAN 代码实现]

前言&#xff1a; 整个工程分为两个文件: gan.py: 网络模型搭建 main.py: 数据集生成&#xff0c;模型训练 目录&#xff1a; GAN 网络结构 gan.py main.py 一 GAN 网络结构 1.1 训练D 最大化V 1.2 训练G 固定G, 最小化 二 gan.py 功能&#xff1a; 实现 鉴别器D …

vue3+elementPlus el-input的type=“number“时去除右边的上下箭头

改成 代码如下 <script lang"ts" setup> import {ref} from vue const inputBtn ref() </script> <template><el-input type"number" v-model"inputBtn" style"width: 80px;" class"no_number">…

超长表单分页校验,下一页和上一页功能

父组件(最外层) <template><xx-layout title"练习"><divslot"content"class"hierarchy-tag-main"><el-steps:space"200":active"currentComponentIndex 1"align-centerstyle"margin-bottom: 30…

Flutter横屏实践

1、Flutter设置横屏 // 强制横屏 SystemChrome.setPreferredOrientations([DeviceOrientation.landscapeLeft,DeviceOrientation.landscapeRight ]); // 强制竖屏 SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp, DeviceOrientation.portraitDown]);另…

【虹科分享】什么是Redis数据集成(RDI)?

大量的应用程序、日益增长的用户规模、不断扩展的技术需求&#xff0c;以及对即时响应的持续追求。想想这些是否正是你在经历的。也许你尝试过自己构建工具来应对这些需求&#xff0c;但是大量的编码和集成工作使你焦头烂额。那你是否知道&#xff0c;有这样一个工具可以帮助你…