今天是组件化的第三篇文章了,前两篇文章主要是以功能为主,分别讲解了 高仿富途牛牛-组件化(一)-支持页签拖拽、增删、小工具和高仿富途牛牛-组件化(二)-磁力吸附,其中也不乏有一些小的bug,不过这些都不是问题。程序员
以前的效果展现只是为了表达意思,界面是真的丑,标准的程序员审美,哈哈哈。今天这篇文章主要是对以前的程序进行了美化,而且进行了一些bug的修改。app
效果美化是参照富途牛牛作的,虽然不是如出一辙,可是确实比以前的效果好了一些,喜欢的同窗能够参考下。ide
文章最后会把描述显示效果的qss文件贴上,但愿能够帮到你们工具
下面gif图所示,录制的时间比较长,你们能够仔细看下,交互效果彻底是参照富途牛牛作的,若有问题,欢迎提出。感谢!!!组件化
欢迎你们提出问题,交互、配色均可以布局
工具箱是一个很重要的功能。咱们的每个独立组件模板都拥有一个工具箱。性能
下面咱们来分析下工具箱是怎么作的this
首先,从界面布局上咱们先来讲下,工具箱从总体颜色划分上,能够分为两个部分:标题栏和客户区窗口。url
标题栏咱们是一个窗口的眼睛,经过标题栏的命名咱们能够看到这个窗口是干什么的,例如展现图中所示,交易、迷你报价、自选股、今日统计等等。
除此以外,标题栏还提供了一个很灵活的操做:移动窗口,咱们能够经过鼠标按下标题栏来进行窗口拖拽
这里咱们为了实现这个功能,重写了QWidget的三个接口,实现内容都比较简单,这里就不作说明了,有兴趣的自行百度,网上一大堆。
virtual void mousePressEvent(QMouseEvent *) override; virtual void mouseMoveEvent(QMouseEvent *) override; virtual void mouseReleaseEvent(QMouseEvent *) override;
最后也是很重要的一点,那就是标题栏还支持关闭窗口,咱们经过点击标题栏上的关闭按钮,能够关闭当前窗口。
对于工具箱来讲,咱们也能够经过点击组件模板工具栏上的按钮进行关闭
一个窗口除过标题栏觉得剩下的就是客户区了,客户端使咱们展现展现数据的主要地方,展现效果中的工具箱里边包含了不少工具按钮,包括通用页签下的迷你报价、自选股、短线精灵,和港股页签下的迷你报价、交易、帐户等等。
工具箱的客户端咱们这里是只有一个QTabWidget类,而通用和港股页签就是QTabWidget下的两个页签。
每一个页签里边都是一个QListWidget,我给QListWidget设置了图表展现模式,让他有了一个钟按钮的显示风格。
上边咱们主要分析了工具箱的一个组成部分,接下来我将会从更为详细的代码层面说明工具箱的实现过程,其中可能会包含一些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文件比较大,会出现这句代码卡顿的状况。若是想要更好的性能,qss建议仍是分开来写,至于怎么合理的拆分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(); }
以上的内容,基本上就是本篇文章的内容全部内容啦!美化功能基本完成,但愿能够帮到你们。
最后再说一句,美化是永无止境的,今天虽然说是讲解界面美化,不过如今这个效果也不是专业美化后的,只能说是比以前的效果稍微好一些。这里也是抛砖引玉,说明美化的方式和技巧,要想有更好的美化效果,仍是得有专业的设计师同窗进行设计
![]() |
![]() |
很重要--转载声明