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

Qt之天气预报——界面优化篇(含源码+注释)

一、界面优化效果

下方为界面优化完成和优化前的效果对比。
优化前
在这里插入图片描述

优化后
在这里插入图片描述

二、优化内容

  1. 添加标题栏
  2. 添加图片(图图标素材源自阿里巴巴矢量图标库)
  3. 更新UI内容(微调大小、布局比例)
  4. 添加鼠标事件函数,实现拖动功能
  5. 添加样式重载函数
  6. 图标添加鼠标悬浮提示
  7. 添加QSS样式以及加载函数

三、优化源码(主要优化内容)

CWeatherForecast类的更新

// .h 头文件
public/**
     * @brief overloadStyle 样式重载函数
     */
    void overloadStyle();
    
    // QWidget interface
protected:
    /**
     * @brief mousePressEvent 鼠标按下事件
     * @param event 鼠标事件对象
     */
    void mousePressEvent(QMouseEvent *event);

    /**
     * @brief mouseReleaseEvent 鼠标释放事件
     * @param event 鼠标事件对象
     */
    void mouseReleaseEvent(QMouseEvent *event);

    /**
     * @brief mouseMoveEvent 鼠标移动事件
     * @param event 鼠标事件对象
     */
    void mouseMoveEvent(QMouseEvent *event);
privatebool                                        m_pressFlag;            // 鼠标按下标记

    QPoint                                      m_startPos;             // 鼠标按下位置

///
// cpp 源文件

void CWeatherForecast::overloadStyle()
{
    // 卸载程序样式
    qApp->style()->unpolish(qApp);
    // 获取当前时间
    int hour = QTime::currentTime().hour();
    // 判断是否夜晚的标记值
    bool flag = hour >= 8 && hour < 20;
    // 设置是否白日动态属性值
    ui->centralWidget->setProperty("IS_DAY", flag);
    // 重载样式
    qApp->style()->polish(qApp);

    // 获取所有控件链表,遍历重绘
    foreach(QWidget *wgt, qApp->allWidgets())
    {
        wgt->repaint();
    }
}


void CWeatherForecast::on_cityEdit_textChanged(const QString &arg1)
{
    // 当城市编码容器包含当前文本Key值则进入
    if(m_codeInfoMap.contains(arg1) || m_codeInfoMap.values().contains(arg1))
    {
        // 发送天气信息请求
        sendWeatherInfoRequest();
    }
}

void CWeatherForecast::mousePressEvent(QMouseEvent *event)
{
    // 当标题栏包含鼠标位置,并且鼠标为左键按下时进入
    if(ui->titleWgt->rect().contains(event->pos()) && Qt::LeftButton == event->button())
    {
        m_pressFlag = true; // 鼠标按下变量值更为true
        m_startPos = event->globalPos();    // 获取鼠标的全局位置
    }
}

void CWeatherForecast::mouseReleaseEvent(QMouseEvent *event)
{
    Q_UNUSED(event);
    m_pressFlag = false;    // 鼠标释放时标记值更为false
}

void CWeatherForecast::mouseMoveEvent(QMouseEvent *event)
{
    // 当标记值为true时进入
    if(m_pressFlag)
    {
        // 当前窗口移动,当前位置 + 最新鼠标全局位置 - 上次鼠标全局位置(此处为了计算出偏移量)
        this->move(this->pos() + event->globalPos() - m_startPos);
        m_startPos = event->globalPos();    // 更新鼠标全局位置
    }
}

WeatherForecast.qss

/****QWidget****/
QWidget
{
	color:white;	/*所有控件字体颜色为白色*/
	background-color:#4b84ff;	/*所有控件背景颜色*/
	background:transparent;		/*所有控件效果透明*/
	font-family:KaiTi;	/*所有控件字体为楷体*/
	font-size:18px;	/*所有控件字体大小*/
}

/**********主窗口**********/
/*日间背景*/
QWidget[MAIN_WINDOW = true][IS_DAY = true]
{
	border-image:url(./StyleTheme/Theme/bg_day.png); /*添加背景图片*/
}
/*夜间背景*/
QWidget[MAIN_WINDOW = true][IS_DAY = false]
{
	border-image:url(./StyleTheme/Theme/bg_night.png);	/*添加背景图片*/
}

QWidget[TITLE_WGT = true]
{
	border-bottom: 1px solid white;
	border-top: 1px solid white;
}

/****QLabel****/
/*天气预报图标*/
QLabel[ICON_LAB = true]
{
	border-image:url(./StyleTheme/Base/tqyb.png);	/*添加标签背景图片*/
}

/*城市标签*/
QLabel[CITY = true]
{
	font-weight:bold;	/*粗体*/
	font-size:20px;		/*字体大小*/
}	

/*天气标签图标*/
QLabel[WEATHER = "晴"]
{
	border-image:url(./StyleTheme/Theme/tianqi-qing.png);
}

QLabel[WEATHER = "阴"]
{
	border-image:url(./StyleTheme/Theme/tianqi-yin.png);
}

QLabel[WEATHER = "多云"]
{
	border-image:url(./StyleTheme/Theme/tianqi-duoyun.png);
}

QLabel[WEATHER = "小雨"]
{
	border-image:url(./StyleTheme/Theme/tianqi-xiaoyu.png);
}

QLabel[WEATHER = "中雨"]
{
	border-image:url(./StyleTheme/Theme/tianqi-zhongyu.png);
}

QLabel[WEATHER = "大雨"]
{
	border-image:url(./StyleTheme/Theme/tianqi-dayu.png);
}

QLabel[WEATHER = "暴雨"]
{
	border-image:url(./StyleTheme/Theme/tianqi-baoyu.png);
}

QLabel[WEATHER = "大暴雨"]
{
	border-image:url(./StyleTheme/Theme/tianqi-dabaoyu.png);
}

QLabel[WEATHER = "小雪"]
{
	border-image:url(./StyleTheme/Theme/tianqi-xiaoxue.png);
}

QLabel[WEATHER = "中雪"]
{
	border-image:url(./StyleTheme/Theme/tianqi-zhongxue.png);
}

QLabel[WEATHER = "大雪"]
{
	border-image:url(./StyleTheme/Theme/tianqi-daxue.png);
}

QLabel[WEATHER = "暴雪"]
{
	border-image:url(./StyleTheme/Theme/tianqi-baoxue.png);
}

QLabel[WEATHER = "雷阵雨"]
{
	border-image:url(./StyleTheme/Theme/tianqi-leiyu.png);
}

QLabel[WEATHER = "浮尘"]
{
	border-image:url(./StyleTheme/Theme/tianqi-shachen.png);
}

QLabel[WEATHER = "霜"]
{
	border-image:url(./StyleTheme/Theme/tianqi-shaung.png);
}

QLabel[WEATHER = "雾"]
{
	border-image:url(./StyleTheme/Theme/tianqi-wu.png);
}

QLabel[WEATHER = "扬沙"]
{
	border-image:url(./StyleTheme/Theme/tianqi-yangsha.png);
}

QLabel[WEATHER = "雨夹雪"]
{
	border-image:url(./StyleTheme/Theme/tianqi-yujiaxue.png);
}

/****QPushButton****/
/*切换按钮*/
QPushButton[SWITCH_MODE_BTN = true]
{
	background-color: #808080;	/*切换按钮背景颜色*/
	border: 2px solid #ffffff;	/*切换按钮边框样式*/
	border-radius: 5px;	/*切换按钮边角圆润*/
}

/*切换按钮悬浮*/
QPushButton[SWITCH_MODE_BTN = true]:hover
{
	background-color: #a2a2a2;	/*悬浮背景色*/
}

/*关闭按钮*/
QPushButton[CLOSE_BTN = true]
{
	width:24px;
	height:24px;
	border-image:url(./StyleTheme/Base/close.png);	/*关闭按钮背景*/
}	

/*关闭按钮悬浮*/
QPushButton[CLOSE_BTN = true]:hover
{
	border-image:url(./StyleTheme/Base/close_hover.png);	/*关闭按钮悬浮背景*/
}

/*最小化按钮*/
QPushButton[MIN_BTN = true]
{
	width:24px;
	height:24px;
	border-image:url(./StyleTheme/Base/min.png);	/*最小化按钮背景*/
}	

/*最小化按钮悬浮*/
QPushButton[MIN_BTN = true]:hover
{
	border-image:url(./StyleTheme/Base/min_hover.png);	/*最小化按钮悬浮背景*/
}


/****QComboBox****/
/*下拉框*/
QComboBox
{
	border: 1px solid #ffffff; /*下拉框样式*/
	border-radius:3px;	/*下拉框边角圆润*/
}

/*点击下拉框的样式*/
QComboBox:on
{
	background-color:rgba(172, 179, 211); /*点击后的背景颜色*/
	border:1px solid blue;
}

/*下拉框下拉按钮的边框*/
QComboBox::drop-down 
{
	border:none;	/*没有边框*/
}

QComboBox::down-arrow 
{
	width: 9px;
	height: 9px;
 	image: url(./StyleTheme/Base/arrow_down2.png);	/*下拉按钮背景图片(未点击)*/
}

QComboBox::down-arrow:on 
{
	image: url(./StyleTheme/Base/arrow_up2.png);	/*下拉按钮背景图片(已点击)*/
}

/*下拉列表的样式*/
QComboBox QAbstractItemView 
{
    background-color: gray; /*下拉列表的背景色*/
}

/****QMenu****/
QMenu 
{
	border: 1px solid #CCCCCC; /* 边框宽度为1px,颜色为#CCCCCC */
	border-radius: 3px; /* 边框圆角 */
	background-color: #FAFAFC; /* 背景颜色 */
}

QMenu::item 
{ /* 菜单子控件item,为菜单项在default的状态 */
	border: 0px solid transparent;
	background-color: transparent;
	color: black; /* 文本颜色 */
	font-size: 18px;
	min-height: 25px;
	padding:5px 5px 5px 5px;
}

QMenu::item:selected 
{ /* 为菜单项在selected的状态 */
	background-color: #EBEBEB;
}

/****QMessageBox****/
QMessageBox
{
	background-color:skyblue;
}

总结

界面优化主要提供给用户使用,养眼的样式会给用户提供良好的体验。同时,做界面优化篇我还体验到UI的重要性,一个好的UI设计会带来许多便利。有需要的小伙伴可私聊取源码。

相关文章

Qt之天气预报实现(一)预备篇
Qt之天气预报——功能实现篇(含源码+注释)

友情提示——哪里看不懂可私哦,让我们一起互相进步吧
(创作不易,请留下一个免费的赞叭 谢谢 ^o^/)

注:文章为作者编程过程中所遇到的问题和总结,内容仅供参考,若有错误欢迎指出。
注:如有侵权,请联系作者删除

相关文章:

  • 如果你不是前端,一定不知道我在说什么
  • Spring BOOT 手写一个starter并使用这个starter
  • C/C++停车场管理系统
  • 【C++进阶】C++11新特性上篇(万字详解)
  • C/C++KTV点歌系统
  • 【Linux修炼手册:基本指令(完结)】
  • vmware ESXI 7 升级ESXI 8
  • 毕业设计 单片机温湿度环境检测仪 - stm32 物联网 嵌入式
  • 为什么在SPI通信中提供不同的模式?
  • 马上跨年了,如何用代码写一个“跨年倒计时”呢?
  • Arcgis中创建Python脚本工具
  • 内存读写指令 —— LDR / STR
  • 华为网工入门之eNSP小实验(5)--VLAN间相互通信的三种方法
  • 2022年底,我手里一共负责了30套系统
  • 绩效考核管理方案
  • 【347天】每日项目总结系列085(2018.01.18)
  • hadoop集群管理系统搭建规划说明
  • Java编程基础24——递归练习
  • js学习笔记
  • Median of Two Sorted Arrays
  • React-生命周期杂记
  • Redash本地开发环境搭建
  • 成为一名优秀的Developer的书单
  • 首页查询功能的一次实现过程
  • 提醒我喝水chrome插件开发指南
  • 字符串匹配基础上
  • python最赚钱的4个方向,你最心动的是哪个?
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • #DBA杂记1
  • #预处理和函数的对比以及条件编译
  • ${factoryList }后面有空格不影响
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (23)Linux的软硬连接
  • (LeetCode) T14. Longest Common Prefix
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (三) diretfbrc详解
  • (算法)求1到1亿间的质数或素数
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .NET 事件模型教程(二)
  • .Net(C#)常用转换byte转uint32、byte转float等
  • .net6+aspose.words导出word并转pdf
  • .NET的数据绑定
  • .Net面试题4
  • .NET中GET与SET的用法
  • /bin/bash^M: bad interpreter: No such file or directory
  • @test注解_Spring 自定义注解你了解过吗?
  • [20150707]外部表与rowid.txt