扁平化你的Qt应用程序

什么是扁平化

这里的扁平化指的是交互设计方面的一种风格。

扁平化是随着极简注意的风潮流行起来的,这个概念最核心的地方就是放弃一切装饰效果,诸如阴影。透视,纹理,渐变等等能做出3D效果的元素一概不用。全部的元素的边界都干净利落,没有不论什么羽化。渐变,或者阴影。从比較早的windows 8的Metro,

windows8

ios7

android4.0

都后面Android4.0的Holo Style,还有iOS7的“Ivy style” 的扁平化设计。

那之后,感觉一切都被拍扁了。

今天从技术的角度来看看怎么让Qt程序扁平化。

终于的效果是这种(一个图片浏览器)

扁平化。走你!

自己定义扁扁的按钮

QWidget w;
w.show().

上面的代码会生成一个Qt的Widget,然后显示出来,这种窗体会带上系统自带的外框,也包括有最大化,最小化之类的按钮,可是这种按钮并非我们须要的style,并且我们也无法控制,所以我们须要自己实现右上角的窗体控制按钮,创建一个pushbutton类,继承自QPushButton。

pushbutton.h

#ifndef PUSHBUTTON_H
#define PUSHBUTTON_H

#include <QPushButton>
#include <QMouseEvent>
#include <QPainter>
#include <QDebug>

class PushButton : public QPushButton
{
	Q_OBJECT

public:
	PushButton(QWidget *parent = 0);
	~PushButton();
	void loadPixmap(QString pic_name);

protected:
	void enterEvent(QEvent *);
	void leaveEvent(QEvent *);
	void mousePressEvent(QMouseEvent *event);
	void mouseReleaseEvent(QMouseEvent *event);
	void paintEvent(QPaintEvent *);

private:
	enum ButtonStatus{NORMAL, ENTER, PRESS, NOSTATUS};
	ButtonStatus status;
	QPixmap pixmap;

	int btn_width;
	int btn_height;
	bool isPressed;
};

#endif // PUSHBUTTON_H

pushbutton.cpp

#include "pushbutton.h"

PushButton::PushButton(QWidget *parent)
	:QPushButton(parent)
{
	status = NORMAL;
	isPressed = false;
}

PushButton::~PushButton()
{

}

void PushButton::loadPixmap(QString pic_name)
{
	pixmap.load(pic_name);
	//QSize picSize(96, 32);
	pixmap = pixmap.scaledToHeight(30);
	btn_width = pixmap.width()/3;
	btn_height = pixmap.height();
	setMinimumSize(btn_width, btn_height);
}

void PushButton::enterEvent(QEvent *)
{
	status = ENTER;
	update();
}

void PushButton::mousePressEvent(QMouseEvent *event)
{
	if (event->button() == Qt::LeftButton)
	{
		isPressed = true;
		status = PRESS;
		update();
	}
}

void PushButton::mouseReleaseEvent(QMouseEvent *)
{
	if(isPressed)
	{
		isPressed = false;
		status = ENTER;
		update();
		emit clicked();
	}
}

void PushButton::leaveEvent(QEvent *)
{
	status = NORMAL;
	update();
}

void PushButton::paintEvent(QPaintEvent *)
{
	QPainter painter(this);
	painter.drawPixmap(rect(), pixmap.copy(btn_width * status, 0, btn_width, btn_height));
}

须要准备一张button的图片。包括button的各个状态,依据button不同的状态在paintEvent函数中绘制图片不同的部分。

去除边框加上widget投影

去除系统自带的边框仅仅须要一行代码就能够了。

setWindowFlags(Qt::FramelessWindowHint);

给widget加入投影的方法卡了我两天。网上现存的有两种方法,一种是先准备好一些阴影的图片,然后手动在paintEvent中把阴影一个部分一个部分画出来。

这个方案费时费力,不灵活,效果也不太好。

还有一种方法是stackoverflow上的,加入一个widget,把全部窗体控件放到这个widget中,给这个widget加入阴影效果,然后放在一个透明的widget上。这个我试了非常久,效果也不太好。

最后给出我的解决方法.

自己定义widget继承自QWidget,构造函数中

	this->setWindowFlags(Qt::FramelessWindowHint);
	this->setAttribute(Qt::WA_TranslucentBackground);

用一个layout装下全部控件,然后

#define SHADOW_WIDT  5

mainLayout->setContentsMargins(SHADOW_WIDTH, SHADOW_WIDTH, SHADOW_WIDTH, SHADOW_WIDTH);
this->setLayout(mainLayout);

在main.cpp中

	MainWindow w;
	QGraphicsDropShadowEffect *wndShadow = new QGraphicsDropShadowEffect;
	wndShadow->setBlurRadius(5.0);
	wndShadow->setOffset(0);
	wndShadow->setColor(QColor("#017acc"));
	w.setGraphicsEffect(wndShadow);
	w.show();  

效果还算完美^.

设置widget背景

两种方法。第一。使用QPalette

m_pMyWidget = new QWidget(this);
m_pMyWidget->setGeometry(0,0,300,100);
QPalette Pal(palette());
// set black background
Pal.setColor(QPalette::Background, Qt::black);
m_pMyWidget->setAutoFillBackground(true);
m_pMyWidget->setPalette(Pal);
m_pMyWidget->show();

另外一种,使用css

m_pMyWidget = new QWidget(this);
m_pMyWidget->setGeometry(0,0,300,100);
m_pMyWidget->setStyleSheet("background-color:black;");
m_pMyWidget->show();

就像用css来修饰Html一样,css也能够用来定义widget的样式,Qt中使用样式表的文档能够參考这里这里

注。不论什么自己定义继承子QWidget的Widget,想要使用样式表,都要手动实现paintevent函数,代码例如以下:

void CustomWidget::paintEvent(QPaintEvent *)
 {
     QStyleOption opt;
     opt.init(this);
     QPainter p(this);
     style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
 }

小结

相比于使用Qt自带的窗体管理,自己定义的扁平化窗体看上肯定高大上很多。但随之而来的是开发成本和设计成本,由于全部的widget如今都须要自己管理(大小,颜色等),所以在开发之前一定要做好权衡。

时间: 2024-10-22 07:47:38

扁平化你的Qt应用程序的相关文章

已知如下数组: var arr = [ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10]; 编写一个程序将数组扁平化去并除其中重复部分数据,最终得到一个升序且不重复的数组

已知如下数组: var arr = [ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10]; 编写一个程序将数组扁平化去并除其中重复部分数据,最终得到一个升序且不重复的数组 var dt= arr.toString().split(",").sort(function(a,b){return a-b}).map(Number);Array.from(new Set(dt)) 代码如下 var d

扁平化设计的历史

[摘要]"扁平化设计"是一种设计风格术语,它抛弃任何能使得作品突显3D效果的特性. 如今一提到网站设计,就会不可避免地碰到"扁平化设计"(flat design)这个词.近几年扁平化设计趋势风生水起,也受到很多大公司的青睐. 但扁平化设计来源是哪里?为什么它风靡网站设计?在设计中,我们只有知道一种风格和技术的来源以及它背后的历史,我们在使用这种美学风格时才能更加得心应手.下面让我们追根溯源,了解扁平化设计的前世今生. 究竟什么是扁平化设计 对于没接触过的人来说,&q

1.扁平化

对象 - 对象映射的一个常见用法是获取一个复杂的对象模型,并将其展开成一个更简单的模型. 您可以采取复杂的模型,如: 1 public class Order 2 { 3 private readonly IList<OrderLineItem> _orderLineItems = new List<OrderLineItem>(); 4 5 public Customer Customer { get; set; } 6 7 public OrderLineItem[] GetO

扁平化设计

扁平化概念的核心意义是:去除冗余.厚重和繁杂的装饰效果.而具体表现在去掉了多余的透视.纹理.渐变以及能做出3D效果的元素,这样可以让“信息”本身重新作为核心被凸显出来.同时在设计元素上,则强调了抽象.极简和符号化. 例如:Windows.Mac OS.iOS.Android等操作系统的设计已经往“扁平化设计”发展.其设计语言主要有Material Design.Modern UI等. 扁平化的设计,尤其是手机的系统直接体现在:更少的按钮和选项,这样使得UI界面变得更加干净整齐,使用起来格外简洁,

扁平化设计:赶一种叫“简约”的时髦

人可以说是一种受感官支配的动物,我们被食物的香味吸引,被悦耳的音乐吸引,更容易吸引我们的是透过视觉看到的东西.因此人也可以说是一种视觉动物,我们很容易通过视觉来判断很多的东西,美丑甚至是善恶.再进一步来说,色彩是抓住我们视觉的核心. 互联网技术发达的今天,我们打开电脑.手机就能看到许多的网站.应用,最先吸引我们的应该不是它们的性能而是色彩.因此对于网站设计来说,界面色彩的设计也是不得马虎的重要环节. 说到设计,扁平化设计应该算是现下的设计热门词,无论是一个网站还是一个应用程序,扁平化和极简的设计

IT传统组织结构及新型扁平化组织

如今互联网企业正凶猛的改变人们衣食住行的方方面面,衣->淘宝,蘑菇街;食->大众点评,口碑;住->去哪,途牛:行->12306, 多次听到互联网的同行介绍他们就是要“快”,快速开发,快速上线,快速反馈,形成一个循环.如何达到快的目的,其企业组织结构也部分反映了这个需求. 虽然我一直算是在这个行业里,但基本上就没在互联网公司呆过,时间线上大部分主干基本上就是在外资企业.近日看了一点传统科技企业和新兴互联网企业的组织结构的资料,比较有意思,结合自己的经历总结一下. 之前我呆过的两家NA

抓住“扁平化”

谈到设计,无论是一个网站还是一个应用程序,扁平化和极简的设计已经成为新的趋势.越来越多的网站设计在UI上走扁平化设计的路线,"扁平化设计"已是当下网页设计的流行趋势.那么,如何让自己融入到这个流行趋势中去? 首先,小编就说说什么是扁平化设计.扁平化完全属于二次元,这个概念最核心的地方就是放弃一切装饰效果,诸如阴影,透视,纹理,渐变等等能做出3D效果的元素一概不用.所有的元素的边界都干净利落,没有任何羽化,渐变,或者阴影.尤其在手机上,更少的按钮和选项使得界面干净整齐,使用起来格外简洁.

闲谈异步调用扁平化

哦,代码--就把它们当成插图吧 随着 CPU 从单核变多核,软件从注重功能到注重体验,Web 从页面跳转方式到 Web2.0 的无刷新加载(AJAX),程序员越来越多的接触多线程和异步.而 Android 的主线程中不允许操作网络,更是将程序员们推向了异步的深渊.异步深渊产生的主要原因是回调,这在 nodejs 里尤其严重. // [node.js] doFirstThing(function(err, data) { doSecondThing(data, function(err, data

扁平化设计2.0

时至今日,扁平化已不再是流行一时的设计风潮,而是一种美学风格.扁平化大胆的用色,简洁明快的界面风格一度让大家耳目一新,当它对元素效果抛弃的如此彻底之际,它又将效果捡起来,改装成另一番模样,使得扁平化进化为扁平化2.0. 扁平化设计特质 对于扁平化的定义,依然没有一个固定范式,但概括起来有下面四个特征: 1)没有多余的效果,例如投影.凹凸或渐变等 2)使用简洁风格的元素和图标 3)大胆丰富且明亮的配色风格 4)尽量减少装饰的极简设计 扁平化所追随的细节依然不变,然而这些"规范"开始松懈了