Qt 桌面系统设计

news2024/12/23 8:14:31

文章目录

  • 前言
  • 一、项目介绍
  • 二、界面布局
  • 三、按键图标
  • 四、桌面背景
  • 五、实现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));            		 // 设置按钮的图标为缩放后的 QPixmap
    button->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.coloradmin.cn/o/751423.html

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

相关文章

在Linux上 USRP RIO 2944 使用 PCIe

支持的硬件 USRP-2900USRP-2901USRP-2920USRP-2921USRP-2922USRP-2930USRP-2932USRP-2940 40 MHzUSRP-2940 120 MHzUSRP-2942 40 MHzUSRP-2942 120 MHzUSRP-2943 40 MHzUSRP-2943 120 MHzUSRP-2944USRP-2945USRP-2950 40 MHzUSRP-2950 120 MHzUSRP-2952 40 MHzUSRP-2952 120 MH…

【Unity面试篇】Unity 面试题总结甄选 |算法相关 | ❤️持续更新❤️

前言 之前整理了一篇关于Unity面试题相关的所有知识点&#xff1a;2022年Unity 面试题 |五萬字 二佰道| Unity面试题大全&#xff0c;面试题总结【全网最全&#xff0c;收藏一篇足够面试】为了方便大家可以重点复习某个模块&#xff0c;所以将各方面的知识点进行了拆分并更新整…

山西电力市场日前价格预测【2023-07-14】

日前价格预测 预测明日&#xff08;2023-07-14&#xff09;山西电力市场全天平均日前电价为315.29元/MWh。其中&#xff0c;最高日前价格为386.08元/MWh&#xff0c;预计出现在21: 45。最低日前电价为232.93元/MWh&#xff0c;预计出现在14: 45。 价差方向预测 1&#xff1a;实…

利用windows恶意软件获取windows主机shell

实验目的&#xff1a; 模拟黑客利用windows恶意软件获取windows主机shell权限的过程 熟悉操作使用的命令实验准备&#xff1a; kali 同网段的windows主机&#xff08;关闭防火墙&#xff09; msfvenom是一个Metasploit独立的有效负载生成器&#xff0c;也是msfpayload和msfenco…

【大数据之Hive】二十二、HQL语法优化之Join优化

主要控制优化使用哪种join算法。 1 Common Join Common Join是Hive中最稳定的join算法也是默认的join算法&#xff0c;其通过一个MapReduce Job完成一个join操作。Map端负责读取join操作所需表的数据&#xff0c;并按照关联字段进行分区&#xff0c;通过Shuffle&#xff0c;将…

【动手学深度学习】--01.线性回归

文章目录 线性回归1.原理1.1线性模型1.2衡量预估质量——平方损失1.3训练数据1.4参数学习1.5优化算法 2.从零开始实现线性回归2.1生成数据集2.2批量读取数据集——Mini-batch思想2.3初始化模型参数2.4定义模型2.5定义损失函数2.6定义优化算法2.7训练模型 3.借助深度学习框架实现…

关于nginx学习记录(一)

系列文章目录 第一章 Nginx 学习入门——Nginx的概述及安装 系列文章目录 一、Nginx 概述 二、安装步骤 1.下载pcre安装包,并放入linux中,进行解压: 2.pcre解压完成后,进入解压后的文件,执行./configure命令 3.在当前目录执行命令:make && make install 4.由于到…

【并发编程的艺术读书笔记】创建线程的四种方式

创建线程的四种方式 继承Thread类 public class MyThread extends Thread {Overridepublic void run() {System.out.println("MyThread...run...");}public static void main(String[] args) {// 创建MyThread对象MyThread t1 new MyThread() ;MyThread t2 new M…

神经网络模型在深度学习中的作用

神经网络模型是一种模拟人脑神经元之间连接和相互作用的数学模型。它由多个神经元&#xff08;节点&#xff09;以层次结构相互连接而成&#xff0c;每个神经元通过学习权重和偏置&#xff0c;根据输入数据产生相应的输出。 在深度学习中&#xff0c;神经网络模型被广泛应用于…

基于ZYNQ阵列涡流检测系统硬件设计(一)

为实现阵列涡流检测系统总体功能&#xff0c;需研制一套多通道信号采集硬件系统&#xff0c;以搭配 软件编程实现分时激励和分时采集。基于以上要求&#xff0c;本章介绍了阵列涡流检测系统的硬 件模块设计。 3.1 阵列涡流检测系统总体设计 阵列涡流检测系统需要利用 DA …

PADS Logic元件库创建的管脚如何快速复制

在绘制原器件封装的时候&#xff0c;如果对管脚一个一个去进行放置会影响效率&#xff0c;因此可以通过对管脚进行复制来实现快速放置管脚。 第一步&#xff1a;在元件界面点击添加端点图标&#xff0c;先进行一个管脚的放置&#xff0c;如图1所示 图1 放置管脚示意图 第二步&…

2.Vue3中Cesium地图初始化及地图控件配置

前言 本文中&#xff0c;我们主要介绍 Cesium 在 Vue 3运行环境的配置&#xff0c;以及 Cesium 实例中控件的显隐设置&#xff0c;本文是后续文章内容的基础&#xff0c;项目代码在此查看&#xff1b;通过本文&#xff0c;我们可以得到一个纯净的 cesium 项目&#xff0c;后续的…

ptrace修改进程数据

ptrace可以修改和读取一个进程的数据 long ptrace(enum __ptrace_request request,pid_t pid,void *addr,void *data); PTRACE_TRACEME, 本进程被其父进程所跟踪。其父进程应该希望跟踪子进程 PTRACE_PEEKTEXT, 从内存地址中读取一个字节&#xff0c;内存地址由addr给出 PT…

基于docker搭建gitea私服仓库,并开启https访问、ssh访问和邮箱验证通知功能

系列文章目录 git常用命令大锦囊 文章目录 系列文章目录前言一、gitea安装1. 安装docker compose2. 安装gitea 二、给gitea配置https访问三、gitea配置ssh方式拉取代码四、给gitea配置可发送的邮箱五、gitea注册开启邮箱验证和邮箱通知六、限制所有仓库只有登录后才能访问七、…

Windows git bash输入vim报错,不能使用vim-plug插件管理器

Windows系统下的git bash在安装时自带了默认的vim&#xff0c;我自己也下了个gvim&#xff0c;并且配置了.vimrc&#xff0c;其中使用了vim-plug管理nerdtree这些插件。但是在bash中vim <file>时&#xff0c;就会蹦出来几行报错&#xff1a; 处理 /c/Users/<username…

pyqt 实现计算器

1.由designer设计实现的计算器类 文件名为&#xff1a;untitled.py # -*- coding: utf-8 -*-# Form implementation generated from reading ui file untitled.ui # # Created by: PyQt5 UI code generator 5.15.9 # # WARNING: Any manual changes made to this file will b…

浅谈无线温度监控系统在低功耗开关柜中的应用

安科瑞 华楠 摘要&#xff1a;为了能够实现实时监测高压开关柜的温度状况&#xff0c;提出一种基于无线传感器网络的开关柜温度在线监测系统。设计的无线温度在线监测系统不仅解决了开关柜内高温、高压、强电磁感应等在恶劣环境下不易检测的问题&#xff0c;而且从硬件选择和软…

谷粒商城篇章4 ---- P102-P172【分布式高级篇一】

目录 1. Elasticsearch 1.1 基本概念 1.1.1 Index&#xff08;索引&#xff09; 1.1.2 Type&#xff08;类型&#xff09; 1.1.3 Document&#xff08;文档&#xff09; 1.1.4 倒排索引机制 1.2 Docker安装 ES 1.2.1 下载镜像文件 1.2.2 运行 Elasticsearch 1.3 初步…

mongodb,redis,mysql 区别

一、MySQL 关系型数据库。 在不同的引擎上有不同 的存储方式。 查询语句是使用传统的sql语句&#xff0c;拥有较为成熟的体系&#xff0c;成熟度很高。 开源数据库的份额在不断增加&#xff0c;mysql的份额页在持续增长。 缺点就是在海量数据处理的时候效率会显著变慢。 二、Mo…

C基础day8(2023.7.10)

一、Xmind整理&#xff1a; 二、课上练习&#xff1a; 练习1&#xff1a;基本类型参数 #include <stdio.h> #include <string.h> #include <stdlib.h> //传参&#xff1a;被调函数需要使用主调函数的局部变量&#xff0c;传参 void Sum(char a,char b);//被…