Qt与电脑管家3

1.ui页面设计技巧

最外面的widget:

上下左右的margin都置相同的值

这里有4个widget,做好一个后,后面3个可以直接复制.ui文件,然后进行微调即可。

2.现阶段实现的效果:

3.程序结构:

btn1--->btn

btn1--->btn2

btn1--->btn3

btn1--->btn4

movable_widget--->widget

widget包含page1,page2

page1包含boot_time,cpu_usage_rate,power,wifi,widget1

boot_time包含progress_bar

cpu_usage_rate包含dashboard

power包含cell

wifi包含speed_detection

widget1包含widget3

page2包含security_defense_system,line_chart

security_defense_system包含btn4,warning

line_chart包含circle

4.实现下面的按钮效果:

cpp 复制代码
#ifndef BTN3_H
#define BTN3_H

#include "btn1.h"
class btn3 : public btn1
{
    Q_OBJECT
public:
    btn3(QWidget * parent = nullptr);
protected:
    void paintEvent(QPaintEvent *) override;
};

#endif // BTN3_H
cpp 复制代码
#include "btn3.h"
#include <QPainter>
#include <QDebug>
btn3::btn3(QWidget * parent ): btn1(parent)
{
    this->setCheckable(1);
    this->setChecked(1);
}

void btn3::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform | QPainter::TextAntialiasing, true);
    //qDebug()<<this->isChecked();
    //画背景
    painter.save();
    painter.setPen(Qt::NoPen);
    painter.setBrush(QBrush(QColor(255,255,255)));
    painter.drawRect(rect());
    painter.restore();
    //画圆角矩形
    painter.save();
    painter.setPen(Qt::NoPen);
    if(this->isChecked()){
        painter.setBrush(QBrush(QColor(51, 94, 255)));
    }
    else{
        painter.setBrush(QBrush(QColor(204, 204, 204)));
    }
    double side=qMin(width(),height());
    painter.drawRoundedRect(rect(),side/2,side/2);
    painter.restore();
    //画白色圆圈
    painter.save();
    painter.setPen(Qt::NoPen);
    painter.setBrush(QBrush(QColor(255,255,255)));
    double r=side*3/5/2;
    QRect circle(-r,-r,2*r,2*r);
    //宽1,2,2,1
    if(this->isChecked()){
        painter.translate(3*width()/4,height()/2);
    }
    else{
        painter.translate(1*width()/4,height()/2);
    }
    painter.drawEllipse(circle);
    painter.restore();
}

5.实现下面的按钮效果:

cpp 复制代码
#ifndef BTN4_H
#define BTN4_H

#include "btn1.h"
class btn4 : public btn1
{
    Q_OBJECT
public:
    btn4(QWidget * parent = nullptr);
    void set_normal_icon(QString icon);
    void set_hover_icon(QString icon);
protected:
    void paintEvent(QPaintEvent *) override;
    void enterEvent(QEvent *event) override;
    void leaveEvent(QEvent *event) override;
private:
    QPixmap normal_icon;
    QPixmap hover_icon;
    bool hover;
};

#endif // BTN4_H
cpp 复制代码
#include "btn4.h"
#include <QPainter>
#pragma execution_character_set("utf-8")
btn4::btn4(QWidget * parent):
    btn1(parent)
{
    hover=0;
}

void btn4::set_normal_icon(QString icon)
{
    normal_icon=QPixmap(icon);
}

void btn4::set_hover_icon(QString icon)
{
    hover_icon=QPixmap(icon);
}

void btn4::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform | QPainter::TextAntialiasing, true);

    //画背景
    painter.save();
    painter.setPen(Qt::NoPen);
    painter.setBrush(QBrush(QColor(255,255,255)));
    painter.drawRect(rect());
    painter.restore();
    //画图标
    painter.save();
    painter.translate(width()/3,height()/2);
    QPixmap image;
    if(hover){
        image=QPixmap(hover_icon);
    }
    else{
        image=QPixmap(normal_icon);
    }
    QPixmap img = image.scaled(this->width()/5, height()*5/6,Qt::IgnoreAspectRatio);
    painter.drawPixmap(-img.width()-5,-img.height()/2,img);
    painter.restore();
    //画文字
    painter.save();
    QFont font;
    font.setPointSize(10);
    font.setBold(true);
    painter.setFont(font);
    QPen pen;
    if(hover){
        pen.setColor(QColor(51, 94, 255));
    }
    else{
        pen.setColor(QColor(0,0,0));
    }
    painter.setPen(pen);
    painter.drawText(width()/3,0,width()*2/3,height(),Qt::AlignLeft | Qt::AlignVCenter,text());
    painter.restore();
}

void btn4::enterEvent(QEvent *event)
{
    hover=1;
    update();
}

void btn4::leaveEvent(QEvent *event)
{
    hover=0;
}

5.局部样式表设计

css 复制代码
#widget{
background-color: rgb(255, 243, 232);
border-top-left-radius:24px;
border-top-right-radius:24px;
}
QLabel{
font: 75 10pt "微软雅黑";
}
#pushButton{
border:none;
color:gray;
font: 10pt "方正小标宋简体";
}
#pushButton_2{
background-color:rgb(51, 94, 255);
border:none;
border-radius:20px;
color: rgb(255, 255, 255);
font: 10pt "方正小标宋简体";
}
#label_2{
border-image: url(:/page2/警告.png);
}

6.实现如下效果:

cpp 复制代码
#ifndef WARNING_H
#define WARNING_H

#include <QWidget>
#include "btn3.h"
namespace Ui {
class warning;
}

class warning : public QWidget
{
    Q_OBJECT

public:
    explicit warning(QWidget *parent = nullptr);
    ~warning();
    void init_button(btn3 * btn);
private slots:
    void on_pushButton_2_clicked();

    void on_pushButton_clicked();

private:
    Ui::warning *ui;
    btn3 * button;
};

#endif // WARNING_H
cpp 复制代码
void security_defense_system::on_pushButton_clicked()
{
    Warn->resize(this->width()-6,Warn->height());
    Warn->move(3,3);
    Warn->show();
}
cpp 复制代码
void warning::on_pushButton_2_clicked()
{
    //确定
    this->hide();
    button->setChecked(0);
}

void warning::on_pushButton_clicked()
{
    //取消
    this->hide();
    button->setChecked(1);
}

对于本人而言,如果直接去实现这样精美的程序,真的超级麻烦,累。

但通过分块,我每次都专注于一点点小的功能实现,很有成就感,同时也在一点点完善自己的小程序。

又做出一个小页面

效果图:

相关推荐
子兮曰3 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰3 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
小羊没烦恼!3 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
前端小万3 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝3 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
三十而立洋3 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
伞伞悦读3 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
卡布鲁3 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
C语言小火车3 天前
C/C++ 为什么需要编译器?
开发语言·c++
霍霍的袁3 天前
【C++】map 和 set 的使用 | 从用法到底层
开发语言·c++·学习·visual studio