Qt 桌面系统设计

文章目录

  • 前言
  • 一、项目介绍
  • 二、界面布局
  • 三、按键图标
  • 四、桌面背景
  • 五、实现led功能
  • 总结

前言

这篇文章介绍 一个Qt 桌面系统的项目,大家可以在此基础上加以改进,实现更多的功能。


一、项目介绍

在这里插入图片描述
可以看到 这个桌面系统上分为两部分,左边是 三个按键(led, 时钟,天气),右边是一个大界面。
点击某个按键就会显示相应的功能界面。此时该界面显示的是 第二个按键时钟的功能界面。

二、界面布局

  1. 首先 左边的三个按键要进行 垂直布局,使用垂直布局管理器设置 QVBoxLayout
  2. 右边的大界面 由于需求是 点击每个按键显示不同的个功能界面,相当于多个界面进行叠加,所以使用栈式布局管理器
  3. 最后将 左边的垂直布的按键右边的栈式布局界面进行 水平布局

注 :
主界面的各种 垂直,水平,栈式 布局不可以使用 ui设计师设置。因为 ui里没有 栈式布局管理器,所以要代码设置。
但是在 栈式布局管理器的子界面(led, 时钟,天气)里 都是简单的部件,可以直接 使用ui设计师设置。

为了方便代码的移植,所以将不同的功能界面分开写入独立文件中。
在这里插入图片描述

Widget::Widget(QWidget *parent): QWidget(parent),ledBtn(this),clockBtn(this),weatherBtn(this)
{setFixedSize(1024, 600);							//固定桌面大小QVBoxLayout* vlayout = new QVBoxLayout();QHBoxLayout* hlayout = new QHBoxLayout(this);slayout = new QStackedLayout();						// 栈式布局管理器ledUI = new ledui();clockUI = new clockui();ledBtn.setFixedSize(90,90);clockBtn.setFixedSize(90,90);weatherBtn.setFixedSize(90,90);vlayout->addWidget(&ledBtn);					//按键加入垂直布局管理器vlayout->addWidget(&clockBtn);vlayout->addWidget(&weatherBtn);slayout->addWidget(ledUI);						//不同界面加入栈式布局管理器slayout->addWidget(clockUI);//slayout->setCurrentIndex(0);			//设置当前界面(默认为0)hlayout->addLayout(vlayout);					//加入水平布局管理器hlayout->addLayout(slayout);setButton_icon(&clockBtn,":/icon/时钟.png");			//自定义函数,设置按键图标setButton_icon(&ledBtn,":/icon/灯泡.png");setButton_icon(&weatherBtn,":/icon/天气预报.png");connect(&ledBtn,SIGNAL(clicked()),this,SLOT(ledclick()));connect(&clockBtn,SIGNAL(clicked()),this,SLOT(clockclick()));
}void Widget::ledclick()
{slayout->setCurrentIndex(0);   //在 相应按键的槽函数中,修改 栈式布局管理器 的界面。
}
void Widget::clockclick()
{slayout->setCurrentIndex(1);
}

三、按键图标

  1. 对于按键,将图标设置到按键上,可能图标太小,不能填充整个按键,这时就要将 图标自适应按键大小。
    通过使用 button->size() 获取按钮的大小,并使用 boundedTo() 函数将其限制在不超过按钮宽度和高度的最大值。 这样图标就可以按比例缩放以适应按钮的大小。

  2. 按键按下不松开时,会出现按下的背景颜色。如果 想让按键 按下显示的是 该桌面的背景色,则需要通过修改样式表 来达到效果。
    按下的颜色设置为 透明色 transparent 即可。

void Widget::setButton_icon(QPushButton *button,QString path)
{QIcon icon(path);  // 加载图像QPixmap pixmap = icon.pixmap(button->size().boundedTo(QSize(button->width(), button->height())));  // 将图标转换为 QPixmap,并按比例缩放以适应按钮大小button->setIcon(QIcon(pixmap));            		 // 设置按钮的图标为缩放后的 QPixmapbutton->setIconSize(pixmap.size());  			// 设置按钮的图标大小为缩放后的 QPixmap 的大小button->setFlat(true);							//按钮将没有边框和背景的凸起效果。button->setStyleSheet("QPushButton:pressed {background-color: transparent;}");    //设置按键按下时背景为透明,可显示底层颜色
}

四、桌面背景

设置桌面背景就要使用 “ 绘画家 ” :QPainter
但是 QPainter 只能在paintEvent 中绘制图形。所以要实现 paintEvent 函数。
对于如何添加资源文件,可以参考我之前的文章:Qt 制作小程序登录系统(超详细)

void Widget::paintEvent(QPaintEvent *)
{QPainter painter(this);// 设置桌面背景QPixmap pixmap(":/icon/背景1.jpg");					//指定的图像文件路径painter.drawPixmap(0,0,pixmap.scaled(width(),height(),Qt::IgnoreAspectRatio,Qt::SmoothTransformation));painter.setRenderHint(QPainter::Antialiasing);				  //抗锯齿渲染painter.translate(width()/2,height()/2);				   //将绘制坐标原点平移到窗口部件的中心
}

五、实现led功能

最后就可以使用 ui 界面布置 led , 时钟,天气 的界面。
对于 led 的按键,要实现点击按键, 点亮开发板 led 的需求,就要结合 驱动, 应用了。

首先 要将写好的驱动加载到开发板,再将 应用程序 写入 ledui.cpp 即可。

编写 ledui.cpp:
在 ledui 界面,有两个按键,一个打开按钮,一个关闭按钮。将两个按钮 分别连接槽函数,进行 led 打开关闭的控制。

ledui::ledui(QWidget *parent) :QWidget(parent),ui(new Ui::ledui)
{ui->setupUi(this);fd = open("/dev/100askled",O_RDWR);					//打开设备节点,获取设备句柄if(fd<0){printf("can not open 100askled \n");}
}void ledui::on_ledon_clicked()
{val = 1;write(fd,&val,1);							//写入 1 点亮 led
}
void ledui::on_ledoff_clicked()
{val = 0;write(fd,&val,1);							//写入 0 熄灭 led
}

总结

后续 会再来介绍一个更为完善的桌面项目,帮助大家更好的学习。

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

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

相关文章

C++虚函数学习

VC6新建一个单文档工程&#xff1b; 添加一个一般类&#xff1b; 生成的Shape.cpp保持不变&#xff1b; #include "Shape.h"#ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]__FILE__; #define new DEBUG_NEW #endif// // Construction/Destruction //Shap…

基于C/S架构工作原理序号工作步骤和理论的区别

基于C/S架构工作原理序号工作步骤和理论的区别 SSH 概念 对称加密linux 系统加密&#xff0c;就是加密和揭秘都是使用同一套密钥。 非对称加密有两个密钥&#xff1a;“私钥”和“公钥”。私钥加密后的密文&#xff0c;只能通过对应的公钥进行揭秘。而通过私钥推理出公钥的…

MyBatis 的架构

MyBatis 的架构 MyBatis 是一个基于 Java 的持久层框架&#xff0c;可以将 SQL 语句和 Java 代码进行分离&#xff0c;通过 XML 或注解的方式配置 SQL 语句并执行&#xff0c;从而实现数据访问的功能。MyBatis 的架构包括以下几个部分&#xff1a; SqlSessionFactory&#xff…

ElasticSearch入门教程--集群搭建和版本比较

文章目录 一、ElasticSearch 集群二、Elasticsearch的核心概念2.1、分片&#xff08;Shards&#xff09;2.2、副本&#xff08;Replicas&#xff09;2.3、路由计算2.4、倒排索引 三、Kibana简介四、Spring Data ElasticSearch 一、ElasticSearch 集群 Elasticsearch 集群有一个…

CAD2021安装教程适合新手小白【附安装包和手册】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、下载文件二、使用步骤1.安装软件前&#xff0c;断开电脑网络&#xff08;拔掉网线、关闭WIFI&#xff09;2、鼠标右击【AutoCAD2021(64bit)】压缩包选择【解…

无线电音频-BPA600蓝牙协议分析仪名词解析

1 介绍 2 Baseband基带分析 (1)Delta 是什么含义? "Delta" 有多个含义,取决于上下文。以下是常见的几种含义: 希腊字母:Delta&#x

【云原生】 一文了解Docker到底是什么?

目录 1.docker是什么&#xff1f; 2.为什么需要docker&#xff1f; 3.docker特点 4.docker架构 5.云计算中的服务包括三个层面 6.传统虚拟化架构 7.容器架构 8.docker系统架构 Docker 守护进程 Docker 客户端 Docker 仓库 Docker 对象 Images&#xff08;镜像&#xff09; Cont…

【网络安全】渗透测试工具——Burp Suite

渗透测试工具Burp Suite主要功能详解 前言一、 Proxy模块1.1 界面布局1.1.1 菜单栏&#xff08;1&#xff09; 菜单栏 Burp&#xff08;2&#xff09; 菜单栏 project&#xff08;3&#xff09; 菜单栏 Intruder&#xff08;4&#xff09; 菜单栏 Repeater&#xff08;5&#x…

【PHP面试题44】PHP5的版本和PHP7之间有哪些区别

文章目录 一、前言二、底层调整2.1性能提升2.2 新的引擎2.3 数据类型改进2.4 错误处理改进2.5 语言特性增加 三、应用层差异3.1 兼容性3.2 类和方法改进3.3 错误处理机制3.4 性能优化3.5 新的扩展支持 四、一些语法糖示例4.1 标量类型声明示例4.2 新增了Spaceship操作符&#x…

【Spring】使用注解读取和存储Bean对象

哈喽&#xff0c;哈喽&#xff0c;大家好~ 我是你们的老朋友&#xff1a;保护小周ღ 谈起Java 圈子里的框架&#xff0c;最年长最耀眼的莫过于 Spring 框架啦&#xff0c;本期给大家带来的是&#xff1a; 将对象存储到 Spring 中、Bean 对象的命名规则、从Spring 中获取bean …

数据库基本操作--------MySQL 索引

目录 一、MySQL 索引 1&#xff0e;索引的概念 2&#xff0e;索引的作用 3&#xff0e;创建索引的原则依据 4&#xff0e;索引的分类和创建 &#xff08;1&#xff09;普通索引 ●直接创建索引 &#xff08;2&#xff09;唯一索引 &#xff08;3&#xff09;主键索引 ●创…

Java InetAddress类

【InetAddress类】 【相关方法】 【使用方法实例】 【代码结果】