Qt+联想电脑管家

news2024/11/15 8:52:05

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.5

        QRectF 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.5

        QRectF 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.5
    QRectF 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.coloradmin.cn/o/833364.html

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

相关文章

十分钟python入门 日期时间

1.Python 日期 Python 中的日期不是其自身的数据类型&#xff0c;但是我们可以导入名为 datetime 的模块&#xff0c;把日期视作日期对象进行处理。 1.1 导入 datetime 模块并显示当前日期&#xff1a; import datetime#导入 datetime 模块并显示当前日期&#xff1a; x da…

Dockerfile构建apache镜像 下载源码

创建工作目录 [rootlocalhost ~]# mkdir tomcat [rootlocalhost ~]# cd tomcat/ 编写配置文件 [rootlocalhost tomcat]# cat Dockerfile #基于的基础镜像 FROM centos:7 #镜像作者信息 MAINTAINER liu <wewed163.com> #安装相关依赖包 RUN yum install -y wget net-…

python与深度学习(十五):CNN和宝可梦模型

目录 1. 说明2. 宝可梦模型2.1 导入相关库2.2 建立模型2.3 模型编译2.4 数据生成器2.5 模型训练2.6 模型保存 3. 宝可梦的CNN模型可视化结果图4. 完整代码5. 宝可梦的迁移学习 1. 说明 本篇文章是CNN的另外一个例子&#xff0c;宝可梦模型&#xff0c;是自制数据集的例子。之前…

从C语言到C++_30(哈希)闭散列和开散列(哈希桶)的实现

目录 1. 哈希结构 1.1 哈希的概念 1.2 哈希冲突(碰撞) 1.3 哈希函数 2. 闭散列/开散列解决哈希冲突 2.1 闭散列概念和代码 2.1.1 闭散列线性探测&#xff08;实现&#xff09; 闭散列线性探测完整代码 2.1.2 闭散列二次探测&#xff08;了解&#xff09; 2.2 开散列(…

无边界野望:高通也有痛点?

外界给予高通的称呼无非是性价屠夫&#xff0c;因为即可“拳打”联发科&#xff0c;又能四度包下上海ChinaJoy展馆做游戏技术支持的王者&#xff0c;对高通来说它的路是无边界的&#xff0c;也是跨界之路上前行的“诗和远方”。 这里&#xff0c;既有生成式AI在终端侧布局、与…

类与对象【上】

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;那个传说中的man的主页 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;题目大解析2 目录 &#x1f449;&#x1f3fb;面向过程和面向对象&#x1f449;&#x1f3fb;类的引…

SAM在医学图像分割的一些研究(Segment Anything Model for Medical Images?(2023))

使用预训练模型通过两种主要模式进行分割&#xff0c;包括自动一切和手动提示(例如&#xff0c;点和框)。SAM在各种自然图像分割任务上取得了令人印象深刻的效果。然而&#xff0c;由于医学图像的形态复杂、解剖结构精细、物体边界不确定和复杂、物体尺度大&#xff0c;使得医学…

中小企业如何做好MES管理系统实施建设

中小企业在生产制造领域面临着诸多挑战&#xff0c;包括提升产品竞争力、规范生产制造等。为了应对这些挑战&#xff0c;越来越多的中小企业开始实施MES生产管理系统。然而&#xff0c;由于企业规模小、资源实力不足等原因&#xff0c;很多企业在实施MES管理系统时存在一定的困…

前端下载文化部几种方法(excel,zip,html,markdown、图片等等)和导出 zip 压缩包

文章目录 1、location.href2、location.href3、a标签4、请求后端的方式5、文件下载的方式6、Blob和Base647、下载附件方法(excel,zip,html,markdown)8、封装下载函数9、导出 zip 压缩包相关方法(流方式) 总结 1、location.href //get请求 window.location.href url;2、locati…

流程图模板有哪些?这几款高频使用模板收好

流程图模板有哪些&#xff1f;流程图是一种常用的图形表现形式&#xff0c;用于展示业务流程或操作流程。对于需要频繁制作流程图的用户&#xff0c;选择一个易用、高效的流程图制作工具非常重要。下面介绍几款高频使用的流程图模板&#xff0c;一起来看看吧&#xff01; 第一款…

iTOP-RK3588开发板Ubuntu 系统交叉编译 Qt 工程-命令行交叉编译

使用源码 rk3588_linux/buildroot/output/rockchip_rk3588/host/bin/qmake 交叉编译 QT 工程。 最后烧写编译好的 buildroot 镜像&#xff0c;将编译好的 QT 工程可执行程序在 buildroot 系统上运行。 交叉编译 QT 工程如下所示&#xff0c;首先进入 QLed 的工程目录下。 然后…

将word每页页眉单独设置

在进行论文排版的时候&#xff0c;总是会出现页眉的页码设置问题&#xff0c;比如出现奇数或偶数页码一致&#xff0c;尝试将前面页码改掉&#xff0c;后面再修改前面也进行了变动&#xff0c;将每页页眉单独设置&#xff1a; &#xff08;1&#xff09;在第一页的最后一行输入…

反步控制理论

一.简单反步控制器 简单反步控制器的设计思想是将复杂的非线性系统分解成不超过系统最高阶数的子系统&#xff0c;然后为每个子系统分别设计Lyapunov函数和中间虚拟控制量&#xff0c;一直“后退” 到整个系统&#xff0c;直到完成整个控制律的设计。 以二阶反步控制器为例&a…

Sui主网升级至V1.6.3版本

Sui主网现已升级至V1.6.3版本&#xff0c;此升级包含了多项修复和优化。升级要点如下所示&#xff1a; #13029 在构建Move代码时&#xff0c;可能会出现与实现自定义transfer/share/freeze函数相关的额外linter警告。这些函数是为了实施自定义的transfer/share/freeze策略而…

Vue的 hash 模式与 history 模式

为了能够在改变视图的同时&#xff0c;不向后端发出网络请求。浏览器提供了 hash 模式与 history 模式。 而 vue 中的路由器就是利用了这两种模式&#xff0c;来实现前端路由的。 路由器的 hash 模式&#xff1a; 一、在 router 目录下的 index.js 文件中&#xff0c;通过 m…

如何使用JavaScript创建一只图像放大镜

如果您曾经浏览过购物网站&#xff0c;可能遇到过图像放大功能。它可以让您放大图像的特定区域&#xff0c;以便浏览。结合这个小小的重要功能可以大大改善您网站的用户体验。 以一种无缝衔接的方式构建图像放大镜可能是个挑战。但是逐步完成这些步骤将帮助您从头开始创建自己的…

【Unity 实用工具篇】✨| 学会使用 可编程瓦片Tile Map,快速搭建2D地图

前言【【Unity 实用工具篇】✨| 学会使用 可编程瓦片Tile Map,快速搭建2D地图一、导入 Tile Map Editor二、创建调色板 Tile Palette三、快速绘制地图四、TilePalette 调色板功能介绍五、TileMap 相关组件属性介绍GirdTilemapTilemap Renderer 瓦片地图渲染器Tile Assets 瓦片…

香港IT软件开发服务公司Alpha Technology 申请纳斯达克IPO上市

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 猛兽财经获悉&#xff0c;总部位于中国香港的IT软件开发服务公司Alpha Technology 近期已向美国证券交易委员会&#xff08;SEC&#xff09;提交招股书&#xff0c;申请在纳斯达克IPO上市&#xff0c;股票代码为&#xff0…

一篇让你熟练掌握Google Guava包

Google Guava guava开源库的地址&#xff1a;github.com/google/guava 这个工具的介绍&#xff0c;搜集自网络&#xff0c;自己整理一下格式&#xff0c;感觉不错&#xff0c;分享一下。最近读源码碰到的有趣工具类挺多&#xff0c;分享大家都学习一下。 概述 工具类 就是封…

零基础入门一文带你了解前端React中组件的使用

目录 一、React 组件介绍 二、创建React组件的两种方式 1. 使用函数创建组件 2. 使用类创建组件 3. 抽离为独立 JS文件 三、React 事件处理 1. 事件绑定 2. 事件对象 四、有状态组件与无状态组件 1. state的基本使用 2. setState() 修改状态 3. 从 JSX 中抽离事件…