Qt+联想电脑管家

1.自定义按钮类

效果:

(1)仅当未选中,未悬浮时

 (2)其他三种情况,均如图

#ifndef BTN_H
#define BTN_H#include <QPushButton>
class btn : public QPushButton
{Q_OBJECT
public:btn(QWidget * parent = nullptr);void set_normal_icon(QString icon);void set_checked_icon(QString icon);void init();
protected:void paintEvent(QPaintEvent *) override;void enterEvent(QEvent *event);void leaveEvent(QEvent *event);
private:QString normal_icon,checked_icon;//选中,悬浮bool hover;
};#endif // BTN_H
#include "btn.h"
#include <QDebug>
#include <QPainter>
#pragma execution_character_set("utf-8")
btn::btn(QWidget * parent ): QPushButton(parent)
{//正常时,无边框//被选中时,背景变换+圆角矩形init();
}void btn::set_normal_icon(QString icon)
{normal_icon=icon;
}void btn::set_checked_icon(QString icon)
{checked_icon=icon;
}void btn::init()
{QSizePolicy sizePolicy1(QSizePolicy::Fixed, QSizePolicy::Fixed);sizePolicy1.setHorizontalStretch(0);sizePolicy1.setVerticalStretch(0);sizePolicy1.setHeightForWidth(this->sizePolicy().hasHeightForWidth());this->setSizePolicy(sizePolicy1);//宽高this->setMinimumSize(QSize(75, 75));this->setMaximumSize(QSize(75, 75));//可选中this->setCheckable(true);hover=false;
}void btn::enterEvent(QEvent *event)
{qDebug()<<"进入事件发生";hover=true;
}void btn::leaveEvent(QEvent *event)
{qDebug()<<"离开事件发生";hover=false;
}void btn::paintEvent(QPaintEvent *)
{QPainter painter(this);painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform | QPainter::TextAntialiasing, true);if(!hover && !this->isChecked()){//画黑图标QPixmap pix(normal_icon);pix=pix.scaled(40,40,Qt::IgnoreAspectRatio);//75*75,40*40//(75-40)/2=12.5QRectF target(12.5, 12.5, 52.5, 52.5);QRectF source(0.0, 0.0, 40.0, 40.0);painter.drawPixmap(target,pix,source);}else{//画圆角矩形QRect rect(0,0,75,75);painter.setPen(Qt::NoPen);painter.setBrush(QBrush(QColor(255,255,255)));painter.drawRoundedRect(rect,10,10,Qt::AbsoluteSize);//画蓝图标QPixmap pix(checked_icon);pix=pix.scaled(40,40,Qt::IgnoreAspectRatio);//75*75,40*40//(75-40)/2=12.5QRectF target(12.5, 12.5, 52.5, 52.5);QRectF source(0.0, 0.0, 40.0, 40.0);painter.drawPixmap(target,pix,source);}
}

2.实验:

label与widget平级,label在widget上面,label显示完全

label在widget里面,label局部显示

 

3.自定义按钮类2: 

效果:

#ifndef BTN2_H
#define BTN2_H#include <QPushButton>
class btn2 : public QPushButton
{Q_OBJECT
public:btn2(QWidget * parent =nullptr);void get_icon(QString path);
protected:void paintEvent(QPaintEvent *) override;
private:QString icon;
};#endif // BTN2_H
#include "btn2.h"
#include <QPainter>
#include <QDebug>
#pragma execution_character_set("utf-8")
btn2::btn2(QWidget *parent):QPushButton(parent)
{}void btn2::get_icon(QString path)
{icon=path;
}void btn2::paintEvent(QPaintEvent *)
{QPainter painter(this);painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform | QPainter::TextAntialiasing, true);//圆角边框QRect rect(0,0,200,75);QPen pen;pen.setColor(QColor(244,244,244));pen.setWidth(3);pen.setStyle(Qt::SolidLine);painter.setPen(pen);painter.setBrush(QBrush(QColor(255,255,255)));painter.drawRoundedRect(rect,10,10,Qt::AbsoluteSize);//蓝色图标QPixmap pix(icon);pix=pix.scaled(40,40,Qt::IgnoreAspectRatio);//75*75,40*40//(75-40)/2=12.5QRectF target(12.5, 12.5, 52.5, 52.5);QRectF source(0.0, 0.0, 40.0, 40.0);painter.drawPixmap(target,pix,source);//文字QFont font;font.setPointSize(12);font.setFamily("隶书");painter.setFont(font);painter.setPen(QColor(0,0,0));painter.drawText(52.5,0,200-52.5,75,Qt::AlignCenter,this->text());}

4.实验:

目标:得到这个蓝色矩形左上角的坐标信息: 

pos : QPoint

它返回的是相对于父窗口的偏移位置,而不是最外面的窗口的。

 可以使用这个函数来实现目标功能:

QPoint Form::get_pos(QWidget * w)
{QWidget * p=qobject_cast<QWidget *>(w->parent());if(p == this){return w->pos();}else{return w->pos()+get_pos(p);}
}

5.注意:在初始化函数中去获取目标位置信息,因为这时候都还没有布局好,得到的结果是错误的。

可用方法:

使用定时器延时一下

    timer.singleShot(100,this,[=](){//这样就可以解决输出为0的问题了for(int i=0;i<btn1.count();++i){btn * one=btn1.at(i);one->set_absolute_pos(get_pos(one));qDebug()<<one->get_absolute_pos();}});

6.问题:

 想实现这样的效果,但延迟比较大,该方案pass,想不出解决办法。

7.QButtonGroup的使用

    group=new QButtonGroup(this);for(int i=0;i<btn1.count();++i){QAbstractButton * b=qobject_cast<QAbstractButton *>(btn1.at(i));group->addButton(b,i+1);}

8.去边框

导入这两个文件movable_widget.h,movable_widget.cpp

#ifndef MOVABLE_WIDGET_H
#define MOVABLE_WIDGET_H#include <QWidget>class movable_widget:public QWidget
{
public:movable_widget(QWidget * parent=0);
protected:void mouseMoveEvent(QMouseEvent *event);void mousePressEvent(QMouseEvent *event);void mouseReleaseEvent(QMouseEvent *event);void paintEvent(QPaintEvent *event);
private:QPoint Pos;bool ismoving;
};#endif // MOVABLE_WIDGET_H
#include "movable_widget.h"
#include <QMouseEvent>
#include <QPainter>
movable_widget::movable_widget(QWidget * parent):QWidget(parent)
{setWindowFlag(Qt::FramelessWindowHint);setAttribute(Qt::WA_TranslucentBackground);}
void movable_widget::mouseMoveEvent(QMouseEvent *event)
{if(ismoving){QPoint now=event->globalPos()-Pos;move(now);}QWidget::mouseMoveEvent(event);
}void movable_widget::mousePressEvent(QMouseEvent *event)
{if(event->button()==Qt::LeftButton){ismoving=true;Pos=event->globalPos()-pos();}QWidget::mousePressEvent(event);
}void movable_widget::mouseReleaseEvent(QMouseEvent *event)
{ismoving=false;QWidget::mouseReleaseEvent(event);
}
void movable_widget::paintEvent(QPaintEvent *event)
{QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing);	// 反锯齿;painter.setBrush(QBrush(Qt::red));painter.setPen(Qt::transparent);QRect rect = this->rect();rect.setWidth(rect.width() - 1);rect.setHeight(rect.height() - 1);painter.drawRoundedRect(rect, 15, 15);QWidget::paintEvent(event);
}

让目标类继承movable_widget类即可

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

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

相关文章

02_kafka_基本概念_基础架构

文章目录 常见的消息队列工作模式基本概念kafka 特性Kafka 基本架构topic 分区的 目的/ 好处 日志存储形式消费者&#xff0c;消费方式 逻辑消费组 高性能写入&#xff1a; 顺序写 mmap读取&#xff1a;零拷贝DMA 使用场景 常见的消息队列工作模式 至多一次&#xff1a;消息被…

pytorch实战-图像分类(二)(模型训练及验证)(基于迁移学习(理解+代码))

目录 1.迁移学习概念 2.数据预处理 3.训练模型&#xff08;基于迁移学习&#xff09; 3.1选择网络&#xff0c;这里用resnet 3.2如果用GPU训练&#xff0c;需要加入以下代码 3.3卷积层冻结模块 3.4加载resnet152模 3.5解释initialize_model函数 3.6迁移学习网络搭建 3.…

UE4/5 GAS技能系统入门2 - AttributeSet

在GAS系统中对属性进行修改需要用到GE&#xff08;Gameplay Effect&#xff09;&#xff0c;而这又涉及到AttributeSet这样的概念。 AttributeSet用于描述角色的属性集合&#xff0c;如攻击力、血量、防御力等&#xff0c;与GAS系统整合度较高&#xff0c;本文就来讲一讲Attri…

Consul屏蔽api

consul 没有设置密码 需要屏蔽api&#xff1a;/v1/internal/ui/nodes?dc&token 防止信息泄露 配置config.json {"http_config": {"block_endpoints": ["/v1/internal/ui/nodes"]} }启动consul时使用该配置&#xff1a; consul agent -de…

Java实现Google cloud storage 文件上传,Google oss

storage 控制台位置 创建一个bucket 点进bucket里面&#xff0c;权限配置里&#xff0c;公开访问&#xff0c;在互联网上公开&#xff0c;需要配置角色权限 新增一个访问权限 &#xff0c;账号这里可以模糊搜索&#xff0c; 角色配置 给allUser配置俩角色就可以出现 在互联…

0.CLIP

目录 前言背景缘起/摘要数据集拟解决问题 精读IntroductionModel2.1自然语言监督2.2 创建一个有效的大数据集选择一个有效的预训练方法2.4 选择模型&#xff08;选择Encoder&#xff09;2.5训练小结 实验 复现&#xff08;略&#xff09; 前言 本课程来自深度之眼《多模态》训…

R语言3_安装SeurateData

环境Ubuntu22/20, R4.1 在命令行中键入&#xff0c; apt-get update apt install libcurl4-openssl-dev libssl-dev libxml2-dev libcairo2-dev libgtk-3-dev # libcairo2-dev :: systemfonts # libgtk :: textshaping进入r语言交互环境&#xff0c;键入&#xff0c; instal…

Mac显示隐藏文件夹

1、设置隐藏文件可见 defaults write com.apple.finder AppleShowAllFiles TRUE 2、killall Finder killall Finder

QtWebApp开发https服务器,完成客户端与服务器基于ssl的双向认证,纯代码操作

引言&#xff1a;所谓http协议&#xff0c;本质上也是基于TCP/IP上服务器与客户端请求和应答的标准&#xff0c;web开发中常用的http server有apache和nginx。Qt程序作为http client可以使用QNetworkAccessManager很方便的进行http相关的操作。Qt本身并没有http server相关的库…

深度学习——全维度动态卷积ODConv

ODConv(OMNI-DIMENSIONAL DYNAMIC CONVOLUTION)是一种关注了空域、输入通道、输出通道等维度上的动态性的卷积方法&#xff0c;因此被称为全维度动态卷积。 part1. 什么是动态卷积 动态卷积就是对卷积核进行线性加权 第一篇提出动态卷积的文章也是在SE之后&#xff0c;他提出…

快速排序【Java算法】

文章目录 1. 概念2. 思路3. 代码实现 1. 概念 快速排序是一种比较高效的排序算法&#xff0c;采用 “分而治之” 的思想&#xff0c;通过多次比较和交换来实现排序&#xff0c;在一趟排序中把将要排序的数据分成两个独立的部分&#xff0c;对这两部分进行排序使得其中一部分所有…

Flask项目打包为exe(附带项目资源,静态文件)

1.在项目根目录创建my_app.spec文件&#xff0c;内容如下&#xff1a; # -*- mode: python ; coding: utf-8 -*-block_cipher Nonea Analysis([server.py], # flask入口pathex[],binaries[], datas[("E:/**/templates","/templates"),("E:/**/s…

绝对领跑!清华最新报告评估,文心大模型3.5稳坐国内第一

近日&#xff0c;清华大学新闻与传播学院沈阳团队发布《大语言模型综合性能评估报告》&#xff08;下文简称“报告”&#xff09;&#xff0c;报告显示百度文心一言在三大维度20项指标中综合评分国内第一&#xff0c;超越ChatGPT&#xff0c;其中中文语义理解排名第一&#xff…

无涯教程-Perl - each函数

描述 在列表context中调用此函数时,将返回一个由2个元素组成的列表,该列表由哈希的下一个元素的键和值组成,以便您可以对其进行迭代。在标量context中调用时,仅返回哈希中下一个元素的键。 语法 以下是此函数的简单语法- each HASH返回值 在列表context中调用此函数时,将返…

(文章复现)建筑集成光储系统规划运行综合优化方法matlab代码

参考文献&#xff1a; [1]陈柯蒙,肖曦,田培根等.一种建筑集成光储系统规划运行综合优化方法[J].中国电机工程学报,2023,43(13):5001-5012. 1.基本原理 本文建立的双层耦合模型内、外层分别对应求解容量配置与能量调度问题。外层模型设置光伏与储能容量备选集并将容量配置组合…

实战项目——多功能电子时钟

一&#xff0c;项目要求 二&#xff0c;理论原理 通过按键来控制状态机的状态&#xff0c;在将状态值传送到各个模块进行驱动&#xff0c;在空闲状态下&#xff0c;数码管显示基础时钟&#xff0c;基础时钟是由7个计数器组合而成&#xff0c;当在ADJUST状态下可以调整时间&…

17款奔驰S400升级原厂前排座椅通风系统,夏天必备的功能

通风座椅的主动通风功能可以迅速将座椅表面温度降至适宜程度&#xff0c;从而确保最佳座椅舒适性。该功能启用后&#xff0c;车内空气透过打孔皮饰座套被吸入座椅内部&#xff0c;持续时间为 8 分钟。然后&#xff0c;风扇会自动改变旋转方向&#xff0c;将更凉爽的环境空气从座…

拦截器——Interceptor及与过滤器区别

目录 spring中拦截器 过滤器跟拦截器的区别 HandlerInterceptor拦截器 拦截器工作原理 拦截器使用场景 定义拦截器 LoginInterceptor 注册拦截器 MethodInterceptor拦截器 方式一&#xff1a;继承 MethodInterceptor 方式二&#xff1a;基于注解的AspectJ方…

用于大型图像模型的 CNN 内核的最新内容

一、说明 由于OpenAI的ChatGPT的巨大成功引发了大语言模型的繁荣&#xff0c;许多人预见到大图像模型的下一个突破。在这个领域&#xff0c;可以提示视觉模型分析甚至生成图像和视频&#xff0c;其方式类似于我们目前提示 ChatGPT 的方式。 用于大型图像模型的最新深度学习方法…

基于自组织竞争网络的患者癌症发病预测(matlab代码)

1.案例背景 1.1自组织竞争网络概述 前面案例中讲述的都是在训练过程中采用有导师监督学习方式的神经网络模型。这种学习方式在训练过程中,需要预先给网络提供期望输出,根据期望输出来调整网络的权重,使得实际输出和期望输出尽可能地接近。但是在很多情况下,在人们认知的过程中…