Qt+联想电脑管家

news/2024/10/18 5:42:16/

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.ppmy.cn/news/1003132.html

相关文章

ad+硬件每日学习十个知识点(18)23.7.29 (LDO原理、LDO的补偿引脚)

文章目录 1.LDO名字介绍2.LDO的应用范围3.LDO的原理4.LDO输出端和输入端的差值至少满足多少V&#xff1f;怎么计算的&#xff1f;5.输出的误差和输出电流&#x1f446;&#xff08;右下角图像&#xff09;6.LDO一般会有个引脚是做补偿之用&#xff0c;datasheet会说明一个器件的…

List与Set的区别

List与Set的区别 大家好&#xff0c;在我们平时的代码编写过程中&#xff0c;经常会碰到需要使用到集合类型: List与Set。很多时候&#xff0c;我们可能会将它们视为同一种类型进行使用&#xff0c;但是在实际的编程逻辑中&#xff0c;它们之间是存在很大差别的。接下来我们就…

AutoSAR系列讲解(实践篇)11.4-NvBlockSwComponents(上)

目录 一、NvBlockSwComponents简介 1、AutoSAR 3.x的情况 2、AutoSAR 4.x的优化 3、架构 4、控制流 二、Nv Port

robots.txt 如何禁止蜘蛛(百度,360,搜狗,谷歌)搜索引擎获取页面内容

什么是蜘蛛抓取 搜索引擎使用spider程序自动访问互联网上的网页并获取网页信息。spider在访问一个网站时&#xff0c;会首先会检查该网站的根域下是否有一个叫做robots.txt的纯文本文件。您可以在您的网站中创建一个纯文本文件robots.txt&#xff0c;在文件中声明该网站中不想…

Python爬虫—破解JS加密的Cookie

前言 在进行网站数据爬取时&#xff0c;很多网站会使用JS加密来保护Cookie的安全性&#xff0c;而为了防止被网站反爬虫机制识别出来&#xff0c;我们通常需要使用代理IP来隐藏我们的真实IP地址。 本篇文章将介绍如何结合代理IP破解JS加密的Cookie&#xff0c;主要包括以下几个…

vscode如何退出/切换 github 账号

退出/切换 github 账号 左下角点击头像按钮&#xff0c;选择注销&#xff0c;然后再重新登录

【Spring】(二)从零开始的 Spring 项目搭建与使用

文章目录 前言一、Spring 项目的创建1.1 创建 Maven 项目1.2 添加 Spring 框架支持1.3 添加启动类 二、储存 Bean 对象2.1 创建 Bean2.1 将 Bean 注册到 Spring 容器 三、获取并使用 Bean 对象3.1 获取Spring 上下文3.2 ApplicationContext 和 BeanFactory 的区别3.3 获取指定的…

Vue3 watch监听器

概览&#xff1a;watch监听器的定义以及使用场景。在vue3中的监听器的使用方式&#xff0c;watch的三个参数&#xff0c;以及进一步了解第一个参数可以是一个属性&#xff0c;也可以是一个数组的形式包含多个属性。 watch在vue3和vue2中的使用&#xff1a; vue3中&#xff1a…