文章目录

  • 一、概述
  • 二、效果展示
  • 三、工具箱
    • 1、布局
      • a、标题栏
      • b、客户区
    • 2、功能详解
  • 四、组件模板工具栏
  • 五、其他界面美化
  • 六、使用qss文件
  • 七、相关文章

一、概述

今天是组件化的第三篇文章了,前两篇文章主要是以功能为主,分别讲解了 高仿富途牛牛-组件化(一)-支持页签拖拽、增删、小工具和高仿富途牛牛-组件化(二)-磁力吸附,其中也不乏有一些小的bug,不过这些都不是问题。

之前的效果展示只是为了表达意思,界面是真的丑,标准的程序员审美,哈哈哈。今天这篇文章主要是对之前的程序进行了美化,并且进行了一些bug的修改。

效果美化是参照富途牛牛做的,虽然不是一模一样,但是确实比之前的效果好了一些,喜欢的同学可以参考下。

文章最后会把描述显示效果的qss文件贴上,希望可以帮到大家

二、效果展示

下面gif图所示,录制的时间比较长,大家可以仔细看下,交互效果完全是参照富途牛牛做的,如有问题,欢迎提出。感谢!!!

欢迎大家提出问题,交互、配色都可以

三、工具箱

工具箱是一个很重要的功能。我们的每一个独立组件模板都拥有一个工具箱。

  • 工具箱自身支持移动
  • 组件模板移动时 会联动工具箱移动(工具箱和组件模板的相对位置不变)

下面我们来分析下工具箱是怎么做的

1、布局

首先,从界面布局上我们先来说下,工具箱从整体颜色划分上,可以分为两个部分:标题栏和客户区窗口。

a、标题栏

标题栏我们是一个窗口的眼睛,通过标题栏的命名我们可以看到这个窗口是干什么的,例如展示图中所示,交易、迷你报价、自选股、今日统计等等。

除此之外,标题栏还提供了一个很灵活的操作:移动窗口,我们可以通过鼠标按下标题栏来进行窗口拖拽

这里我们为了实现这个功能,重写了QWidget的三个接口,实现内容都比较简单,这里就不做说明了,有兴趣的自行百度,网上一大堆。

virtual void mousePressEvent(QMouseEvent *) override;
virtual void mouseMoveEvent(QMouseEvent *) override;
virtual void mouseReleaseEvent(QMouseEvent *) override;

最后也是很重要的一点,那就是标题栏还支持关闭窗口,我们通过点击标题栏上的关闭按钮,可以关闭当前窗口。

对于工具箱来说,我们也可以通过点击组件模板工具栏上的按钮进行关闭

b、客户区

一个窗口除过标题栏以为剩下的就是客户区了,客户端使我们展示展示数据的主要地方,展示效果中的工具箱里边包含了很多工具按钮,包括通用页签下的迷你报价、自选股、短线精灵,和港股页签下的迷你报价、交易、账户等等。

工具箱的客户端我们这里是只有一个QTabWidget类,而通用和港股页签就是QTabWidget下的两个页签。

每个页签里边都是一个QListWidget,我给QListWidget设置了图表展示模式,让他有了一个钟按钮的显示风格。

2、功能详解

上边我们主要分析了工具箱的一个组成部分,接下来我将会从更为详细的代码层面说明工具箱的实现过程,其中可能会包含一些qss样式表,全部的样式表将会在文章最后贴出

上边已经提供到两个页签里边的工具按钮都是包含在QListWidget控件中的,下面我直接贴出页签初始化的关键代码

void ToolBoxDialog::InitializeTools(int start, int end, const QString & title)
{QListWidget * normalWidget = new QListWidget;normalWidget->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);normalWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);connect(normalWidget, &QListWidget::itemClicked, this, &ToolBoxDialog::ItemClicked);normalWidget->setDragEnabled(false);normalWidget->setViewMode(QListView::IconMode);normalWidget->setResizeMode(QListView::Adjust);normalWidget->setSpacing(3);for (int i = start; i < end; ++i){normalWidget->addItem(createItem(toolNames[i], toolTypes[i]));}m_pTabWidget->addTab(normalWidget, title);
}

从上边代码可以看出,我们的列表使用了图标(QListView::IconMode)显示模式,并且设置了图标项不可以拖拽。

最后我们使用一个循环构造了很多item,插入到了QListWidget控件中

样式美化代码如下,不了解Qss语法的可以参考qt qss这篇文章,我以前写的,比较详细。

QDialog#ToolBoxDialog QTabWidget::pane { border-top: 1px solid #2B3236; }
QDialog#ToolBoxDialog QTabWidget::tab-bar { top:1px;}
QDialog#ToolBoxDialog QTabBar::tab { background:#1D2224;border-bottom: 1 solid #2B3236; min-width: 20ex; padding: 4px; color:#919AA3; }
QDialog#ToolBoxDialog QTabBar::tab:selected {      border-bottom: 1 solid #FF9900; }
QDialog#ToolBoxDialog QTabBar::tab:hover {      border-bottom: 1 solid #FFB700; }
QDialog#ToolBoxDialog QTabBar::tab:!selected:!hover {      border-bottom: 1 solid #2B3236; }QDialog#ToolBoxDialog QListView{border:0px solid blue;margin-top:12px;margin-left:12px;outline:none;}
QDialog#ToolBoxDialog QListView::item{padding-top:10px;border:1 solid transparent;}
QDialog#ToolBoxDialog QListView::item:hover{color:#FF9900;background:#6B7276;}

最后也是最重要的一点,item我们是怎么构造的

static QListWidgetItem * createItem(const QString & text, SubWindowNormalType type)
{QListWidgetItem * item = new QListWidgetItem;item->setSizeHint(QSize(72, 72));//设置项大小item->setFlags(item->flags() & ~Qt::ItemIsSelectable);//设置项不可以被选中item->setText(text);item->setData(UserType, type);item->setIcon(QPixmap("./image/mainWindow/tquant-btn_normal.png"));//设置图标return item;
}

代码比较简单,但是需要特别注意,代码中调用的每一个接口,都是必不可少的。

四、组件模板工具栏

关于工具栏的实现,我们可以参考高仿富途牛牛-组件化(一)-支持页签拖拽、增删、小工具这篇文章,今天这篇文章我们只讲解怎么美化,虽然美化效果没有很明显,我们还是凑合着看吧。

这里同样也是使用了Qt的动态属性功能,这真是Qt的一个很强大的能力,有了动态属性,我们可以很容易的做出一些交互上比较复杂的效果。

鼠标hover时的文字颜色就是使用了动态属性来实现。仔细看如下qss样式表,当QLabel的Hovered属性为true时(实际上QLabel并没有达到hover,这里我们是模拟了hover行为),我们启用了一种新的文字颜色。

TabButton#tab_Button:hover{border-bottom:1 solid #FFB700;}
TabButton#tab_Button[Selected=true]{border-bottom:1 solid #FF9900;color:#FF9900;}
TabButton#tab_Button QLabel[Hovered=true]{color:#FF9900;}
TabButton#tab_Button QLabel[SelectedColor=true]{color:#FF9900;}
TabButton#tab_Button QToolButton{border:0px;border-image:url(./image/common/titlebar_normal.png) 0 0 0 78;}
TabButton#tab_Button QToolButton:hover{border:0px;border-image:url(./image/common/titlebar_hover.png) 0 0 0 78;}

再看实现代码,当我们的鼠标移入自定义的标签页按钮时,给子控件(文本控件)设置了动态属性,并刷新了界面

void TabButton::enterEvent(QEvent * event)
{m_pTitle->setProperty("Hovered", "true");m_pTitle->style()->unpolish(m_pTitle);m_pTitle->style()->polish(m_pTitle);__super::enterEvent(event);
}

自定义的页签按钮,本身是一个QWidget,他内部包含了QLabel文本和QToolButton关闭按钮,为了让QLabel还没有hover的时候,我们给他制造一种hover假象,我们使用了动态属性。

这个组件化demo中使用动态属性的地方其实比较多,这里就不一一例举出来了,说明一个,大家知道有这么会事,自己也学会使用即可

五、其他界面美化

讲完工具箱和组件模板工具栏美化之后,其他界面的美化就比较简单了。

剩下的就是subPanel和小窗口的美化,这里我重点说下小窗口的美化,有一个边框颜色的改变这个地方。

当小窗口获取焦点时,边框是黄色的,失去焦点时边框是灰色的

实现方式如下,这里我重写了窗口获取焦点和失去焦点的接口,并且进行设置了Qt内置的动态属性,然后在qss中对属性进行了样式配置

代码如下

//获取焦点时
void SmallWidget::focusInEvent(QFocusEvent * event)
{setProperty("SelectedWidget", "true");style()->unpolish(this);style()->polish(this);__super::focusInEvent(event);
}
//失去焦点时
void SmallWidget::focusOutEvent(QFocusEvent * event)
{setProperty("SelectedWidget", "false");style()->unpolish(this);style()->polish(this);__super::focusOutEvent(event);
}

qss样式如下

QWidget#small_widget_title
{border-bottom:1 solid #2B5470;background:#292F33;
}
QWidget#SmallWidget
{border:1 solid #474F57;background:#1D2224;
}
QWidget#SmallWidget[SelectedWidget=true]
{border:2 solid #FFE100;
}

是不是很简单,哈哈哈哈。

最后我贴出完整的qss样式表,为了显示更多内容,这里我把多余的换行符都去掉了。

QDialog{ border:1px solid #7b8187}
QWidget{    background:#28323f;color:#DDDDDD;}QWidget#small_widget_title{   border-bottom:1 solid #2B5470;background:#292F33;}
QWidget#SmallWidget{    border:1 solid #474F57;background:#1D2224;}
QWidget#SmallWidget[SelectedWidget=true]{  border:2 solid #FFE100;}
QWidget#DragToolBar{    background:#1D2224;border-bottom:1 solid #2B3236;}
QWidget#ToolBoxTitle{   border-bottom:1 solid #2B5470;background:#292F33;}
QWidget#ToolBoxDialog{  background:#28323F;border:1 solid #474F57;}TabButton#tab_Button:hover{border-bottom:1 solid #FFB700;}
TabButton#tab_Button[Selected=true]{border-bottom:1 solid #FF9900;color:#FF9900;}
TabButton#tab_Button QLabel[Hovered=true]{color:#FF9900;}
TabButton#tab_Button QLabel[SelectedColor=true]{color:#FF9900;}
TabButton#tab_Button QToolButton{border:0px;border-image:url(./image/common/titlebar_normal.png) 0 0 0 78;}
TabButton#tab_Button QToolButton:hover{border:0px;border-image:url(./image/common/titlebar_hover.png) 0 0 0 78;}QDialog#ToolBoxDialog QTabWidget::pane { border-top: 1px solid #2B3236; }
QDialog#ToolBoxDialog QTabWidget::tab-bar { top:1px;}
QDialog#ToolBoxDialog QTabBar::tab { background:#1D2224;border-bottom: 1 solid #2B3236; min-width: 20ex; padding: 4px; color:#919AA3; }
QDialog#ToolBoxDialog QTabBar::tab:selected {      border-bottom: 1 solid #FF9900; }
QDialog#ToolBoxDialog QTabBar::tab:hover {      border-bottom: 1 solid #FFB700; }
QDialog#ToolBoxDialog QTabBar::tab:!selected:!hover {      border-bottom: 1 solid #2B3236; }QDialog#ToolBoxDialog QListView{border:0px solid blue;margin-top:12px;margin-left:12px;outline:none;}
QDialog#ToolBoxDialog QListView::item{padding-top:10px;border:1 solid transparent;}
QDialog#ToolBoxDialog QListView::item:hover{color:#FF9900;background:#6B7276;}

六、使用qss文件

设置外部qss文件的流程如下:

  1. 找到qss文件
  2. 加载qss文件
  3. 通过QApplication::setStyleSheet设置样式表

这样是一种比较冷通的设置方式,一旦qss文件比较大,会出现这句代码卡顿的情况。如果想要更好的性能,qss建议还是分开来写,至于怎么合理的拆分qss文件,可以根据自己的需求来拆分

这里提供我之前使用过的两种方式

  1. 控件级别,每个控件对应一个qss文件
  2. 功能级别,一个功能模块一个qss文件

拆分的好处我就不多说了,谁用谁知道!!!

话不多说,直接上代码了。

SetCurrentDirectory(a.applicationDirPath().toStdWString().c_str());QString qssFile = a.applicationDirPath() + "\\TemplateLayout.qss";
QFile qss(qssFile);
qss.open(QFile::ReadOnly);
if (qss.isOpen())
{QString btnstylesheet = QObject::tr(qss.readAll());a.setStyleSheet(btnstylesheet);qss.close();
}

七、相关文章

高仿富途牛牛-组件化(一)-支持页签拖拽、增删、小工具

高仿富途牛牛-组件化(二)-磁力吸附

以上的内容,基本上就是本篇文章的内容所有内容啦!美化功能基本完成,希望可以帮到大家。

最后再说一句,美化是永无止境的,今天虽说是讲解界面美化,不过现在这个效果也不是专业美化后的,只能说是比之前的效果稍微好一些。这里也是抛砖引玉,说明美化的方式和技巧,要想有更好的美化效果,还是得有专业的设计师同学进行设计

如果您觉得文章不错,不妨给个打赏,写作不易,感谢各位的支持。您的支持是我最大的动力,谢谢!!!

很重要–转载声明

  1. 本站文章无特别说明,皆为原创,版权所有,转载时请用链接的方式,给出原文出处。同时写上原作者:朝十晚八 or Twowords

  2. 如要转载,请原文转载,如在转载时修改本文,请事先告知,谢绝在转载时通过修改本文达到有利于转载者的目的。


高仿富途牛牛-组件化(三)-界面美化相关推荐

  1. 高仿富途牛牛-组件化(五)-如何去管理炒鸡多的小窗口

    目录 一.概述 二.效果展示 三.功能类 四.设计上的考虑 1.功能拆分 2.关键类 五.相关文章 一.概述 代码写的久了,什么功能都想搞点儿模式.不知道是不是只有我一个人这么想的,做功能时不在是只为 ...

  2. 高仿富途牛牛-组件化-如何去管理超级多的小窗口

    一.概述 代码写的久了,什么功能都想搞点儿模式.不知道是不是只有我一个人这么想的,做功能时不在是只为了完成功能,而是在完成功能的同时会去考虑可扩展性怎么样?哪块儿的代码可以复用?又或者哪里需要留更多的 ...

  3. Qt (高仿Visio)流程图组件开发(三) 图元基类如何定义,流程图多种图元类型实现

    文章目录 本系列目录 前言 一.图元基类的定义 1.图元信息基类结构体 2.图元位置 3.父子对象关系 二.自定义图元实现 1.自定义图元基类(FlowchartGraphicsItem)与Qt原生图 ...

  4. Qt (高仿Visio)流程图组件开发(二) 基本图元绘制 图元间连线绘制

    文章目录 本系列目录 前言 一.如何绘制图元 二.两图元之间如何连线 三.如何实现线跟随图元移动 四.线的位置判断 总结 本系列目录 Qt (高仿Visio)流程图组件开发(一) 效果展示及基本开发框 ...

  5. Android之高仿墨迹天气桌面组件(AppWidgetProvider) .

    Android之高仿墨迹天气桌面组件(AppWidgetProvider) . 点击:382 发布时间:2012-10-03 更多0 相信墨迹天气,大家都见过,他在时间显示和天气界面上,很吸引人,今天 ...

  6. Qt (高仿Visio)流程图组件开发(九) 流程图 代码展示

    文章目录 本系列目录 本系列目录 Qt (高仿Visio)流程图组件开发(一) 效果展示及基本开发框架构思 Qt (高仿Visio)流程图组件开发(二) 基本图元绘制 图元间连线绘制 Qt (高仿Vi ...

  7. Vue源码学习 - 组件化(三) 合并配置

    Vue源码学习 - 组件化(三) 合并配置 合并配置 外部调用场景 组件场景 总结 学习内容和文章内容来自 黄轶老师 黄轶老师的慕课网视频教程地址:<Vue.js2.0 源码揭秘>. 黄轶 ...

  8. 纯html+css+js高仿苹果手机时钟小组件

    话不多数说,这是一款用html+css+js开发的高仿苹果手机时钟组件, 作者将苹果的小组件移植到浏览器插件中,可以在BdTab插件安装该组件 HTML <div style="wid ...

  9. vue高仿立体卡片效果(第三版)

    组件 如图所示: 使用方法 <template><div class="Home w100 h100"><!-- tab切换 start --> ...

最新文章

  1. PHP 读写数据库出现中文乱码问题
  2. SPOJ 287 Smart Network Administrator
  3. pymssql mysql_Python利用pymssql访问mysql数据库
  4. jQuery源码分析系
  5. Nsight Compute与nvprof metrics 对照
  6. 强大的代码保护软件 .NET Reactor使用教程(四): .NET Reactor针对De4Dot脱壳工具的应对
  7. https://mp.csdn.net/
  8. sqlserver加载驱动失败的问题
  9. 谈谈 CGI、FastCGI、PHP-CGI、PHP-fpm
  10. sort函数的用法(C++排序库函数的调用)对数组进行排序,在c++中有库函数帮我们实现,这们就不需要我们自己来编程进行排序了。
  11. Numpy 简单教程(二)数组的形状(shape)操作
  12. 【数据结构】Java实现栈
  13. 基础篇(二).ARMv8寄存器(2)
  14. C语言初阶-C语言中static的用法
  15. 华为hcie认证工程师里一定要知道的Radius 基本介绍
  16. 举个栗子!Tableau 技巧(113):在工作表中嵌入可切换网页
  17. ElasticSearch(ES)详解(二)
  18. 社会实践活动报告—06暑假饭店打工
  19. 【评测】重组C因子法内毒素检测技术解析
  20. 云栖专辑 | 阿里开发者们的第14个感悟:技术拓宽价值边界

热门文章

  1. 【数理知识】矩阵普通乘积,哈达玛积,克罗内克积,点乘,点积,叉乘,matlab代码实现
  2. 线性代数导论17——正交矩阵和Gram-Schmidt正交化
  3. 河北省专接本计算机大纲,河北专接本考试科目大纲
  4. python开发ps插件_你还在用PS?Python 20行代码批量抠图
  5. 高清硬盘录像机市场分析
  6. 计算机基础第四章//一些数据传输速率
  7. 微信小程序会替代原生APP吗?
  8. 八股(一天更新一点)
  9. CV_DbgAssert(CV_ELEM_SIZE1(traits::Depth<_Tp>::value) == elemSize1())解释
  10. 【Halcon学习之路】图像采集助手