当前位置: 首页 > news >正文

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.lryc.cn/news/107839.html

相关文章:

  • 论文阅读-BotPercent: Estimating Twitter Bot Populations from Groups to Crowds
  • 用于永磁同步电机驱动器的自适应SDRE非线性无传感器速度控制(MatlabSimulink实现)
  • Spring Cloud+Spring Boot+Mybatis+uniapp+前后端分离实现知识付费平台免费搭建 qt
  • 删除注释(力扣)
  • 阿里云AK创建
  • OC与Swift的相互调用
  • 某银行软件测试笔试题
  • SpringMVC概述、SpringMVC的工作流程、创建SpringMVC的项目
  • 一文说清楚支付架构
  • 【Golang 接口自动化00】为什么要用Golang做自动化?
  • Android 架构模式如何选择
  • 深入了解 LoRaWAN® B 类设备
  • KK集团再闯港交所:引领潮流零售市场,2023年一季度业绩增势显著
  • Vue中的组件渲染
  • docker 保存和载入镜像
  • Java框架(九)--Spring Boot入门(1)
  • 2023年第四届“华数杯”数学建模思路 - 案例:随机森林
  • Redis中缓存穿透、击穿、雪崩以及解决方案
  • 系统架构设计师-软件架构设计(6)
  • Knife4j系列--解决不显示文件上传的问题
  • 深入学习Mysql引擎InnoDB、MylSAM
  • 第七章:SpringMVC中
  • MySQL数据库——DQL操作——基本查询
  • Electron 开发,报handshake failed; returned -1, SSL error code 1,错误
  • 知识区博主转型——兼做知识区和改造区博主!!!!!
  • Resnet与Pytorch花图像分类
  • 【NLP概念源和流】 03-基于计数的嵌入,GloVe(第 3/20 部分)
  • 【React】关于组件之间的通讯
  • item_get-小红薯-商品详情
  • 网络安全进阶学习第十课——MySQL手工注入