自定义QT窗口部件外观之QStyle
自定义QT窗口部件外观
重新定义Qt内置窗口部件的外观常用的方法有两种:一是通过子类化QStyle 类或者预定义的一个样式,例如QWindowStyle,来定制应用程序的观感;二是使用Qt样式表。
QStyle 类的使用
1. 准备必要的背景图片。在你想添加自定义风格的工程目录下新建一个文件夹“images”,将背景图片等放入文件夹“images”。
2. 点击Qt Creator的“文件”->“新建文件或工程”->模板选择“Qt”,再选择Qt资源文件->点击“选择”按钮->输入名称->点击“下一步”->点击“完成”。
3. 双击打开Qt Creator的项目管理器中的“**.qrc”资源文件,单击“添加”->“添加前缀”,将前缀名“/new/***”更名为“/”->再次单击“添加”->“添加文件”->将工程目录下“images”文件夹的图片添加进来。保存并关闭资源管理器。
4. 下面开始创建样式子类。新建C++类,命名为myStyle。
5. 修改头文件“mystyle.h”。头文件修改好后如下:
#include<QtGui>
#include<QPalette>
#include<QMotifStyle>
classmyStyle:publicQMotifStyle
{
Q_OBJECT
public:
myStyle();
//以下三个函数在装载Style和卸载Style时调用,它可以是适当修改窗口部件和调色板
voidpolish(QPalette&palette);//改变调色板为样式指定的颜色调色板
voidpolish(QWidget*widget);//初始化给定窗口部件的外观,窗口部件每一次创建后首次显示之前调用
voidunpolish(QWidget*widget);//取消polish()的作用
intpixelMetric(PixelMetricmetric,constQStyleOption*option,
constQWidget*widget)const;//设置各部件的线宽,大小等
intstyleHint(StyleHinthint,constQStyleOption*option,
constQWidget*widget,QStyleHintReturn*returnData)const;//分别设置各种部件的布局,比如checkbox的text在左边或者在右边
voiddrawPrimitive(PrimitiveElementelement,constQStyleOption*option,
QPainter*painter,constQWidget*widget)const;
//这个则是最重要的,在这里面可以实现对不同部件的原始元素的绘制,当然你也可以调用默认的方法.element这个参数就是我们需要重绘的部件的原始元素
voiddrawControl(ControlElementelement,constQStyleOption*option,
QPainter*painter,constQWidget*widget)const;
};
我们这里用QMotifStyle类作为基类,当然你也可以采用其他预定义的样式作为基类。至于选择哪个基类来继承完全取决用户,通常选择和自己所期望的最相近的类来继承。这里贴一个图,主要是继承层次的图:
6. 实现文件“mystyle.cpp”的函数定义。
voidmyStyle::polish(QPalette&palette)
{
QColorbrown(212,140,95);//褐色
QColorslightlyOpaqueBlack(0,0,0,63);
QColorveryLightGreen(204,232,215);//浅绿色
QPixmapbackgroundImage(":/images/bgPortrait.jpg");
QPixmapbuttonImage(":/images/wood.jpg");
QPixmapmidImage=buttonImage;//滑动条背景
QPainterpainter;//画笔
painter.begin(&midImage);
painter.setPen(Qt::NoPen);
painter.fillRect(midImage.rect(),slightlyOpaqueBlack);
painter.end();
palette=QPalette(brown);//调色板
palette.setBrush(QPalette::BrightText,Qt::white);
palette.setBrush(QPalette::Base,veryLightGreen);//设置输入框背景
palette.setBrush(QPalette::Highlight,Qt::darkGreen);//设置鼠标选中的背景色为深绿色
palette.setBrush(QPalette::Button,buttonImage);//设置按钮背景
palette.setBrush(QPalette::Mid,midImage);//设置滑动条背景
palette.setBrush(QPalette::Window,backgroundImage);//设置应用程序背景
QBrushbrush=palette.background();
brush.setColor(brush.color().dark());
palette.setBrush(QPalette::Disabled,QPalette::WindowText,brush);
palette.setBrush(QPalette::Disabled,QPalette::Text,brush);
palette.setBrush(QPalette::Disabled,QPalette::ButtonText,brush);
palette.setBrush(QPalette::Disabled,QPalette::Base,brush);
palette.setBrush(QPalette::Disabled,QPalette::Button,brush);
palette.setBrush(QPalette::Disabled,QPalette::Mid,brush);
}
应用程序的颜色外观主要在这个函数设定,至于可以设置哪些外观,请参考Qt帮助文档的 “QPalette::ColorRole”部分。
voidmyStyle::polish(QWidget*widget)
{
if(qobject_cast<QPushButton*>(widget)
||qobject_cast<QComboBox*>(widget))
widget->setAttribute(Qt::WA_Hover,true);
//鼠标进入或者离开窗口部件所在区域时,会产生一个绘制事件
}
voidmyStyle::unpolish(QWidget*widget)
{
if(qobject_cast<QPushButton*>(widget)
||qobject_cast<QComboBox*>(widget))
widget->setAttribute(Qt::WA_Hover,false);
}
intmyStyle::pixelMetric(QStyle::PixelMetricmetric,
constQStyleOption*option,constQWidget*widget)const
{
switch(metric)
{
casePM_ComboBoxFrameWidth:
return6;
casePM_ScrollBarExtent:
returnQMotifStyle::pixelMetric(metric,option,widget)+4;
default:
returnQMotifStyle::pixelMetric(metric,option,widget);
}
}
intmyStyle::styleHint(QStyle::StyleHinthint,
constQStyleOption*option,constQWidget*widget,
QStyleHintReturn*returnData)const
{
switch(hint)
{
caseSH_DitherDisabledText:
returnint(false);
caseSH_EtchDisabledText:
returnint(true);
default:
returnQMotifStyle::styleHint(hint,option,widget,returnData);
}
}
voidmyStyle::drawPrimitive(QStyle::PrimitiveElementelement,
constQStyleOption*option,QPainter*painter,constQWidget*widget)const
{
QMotifStyle::drawPrimitive(element,option,painter,widget);
}
这里采用的是默认的绘制函数,如果要改变PushButton等部件的形状外观,请上网查阅相关资料或查阅相关书籍。
voidmyStyle::drawControl(QStyle::ControlElementelement,
constQStyleOption*option,QPainter*painter,constQWidget*widget)const
{
QMotifStyle::drawControl(element,option,painter,widget);
}
这里也是采用默认的绘制函数。
7. 修改“main.cpp”文件。首先添加 #include"mystyle.h"
然后在main函数中添加QApplication::setStyle(newmyStyle);
这样,自定义样式的工作就全部完成了。这里只是对QStyle类的使用做了简单介绍。你也可以参考Qt的Demo例子“styles”。如需详细了解自定义样式的相关知识,请访问网站http://doc.trolltech.com/4.3/style-reference.html
http://blog.csdn.net/liuguangzhou123/article/details/7458450
自定义QT窗口部件外观之QStyle的更多相关文章
- Qt窗口部件及子部件
QWidget类是所有用户界面对象的基类,被称为基础窗口部件. #include <QApplication> #include<QLabel> #include<QWi ...
- 如何获得 Qt窗口部件在主窗口中的位置--确定鼠标是否在某一控件上与在控件上的位置
用Qt Creator 设计程序时,最方便的就是ui设计器,可以很容易的得到想要的布局. 但是这样自动布局带来的后果是很难知道窗口中某一部件在主窗口中的相对位置. 在处理子窗口鼠标事件时变的很麻烦.主 ...
- Qt学习之自定义窗口部件
自定义Qt窗口部件 实现一个十六进制的SpinBox,一般SpinBox只支持十进制整数,但是可以子类化方法实现该功能 需重新实现以下虚函数 virtual QString textFromValue ...
- C++ GUI Qt4编程-创建自定义窗口部件
C++ GUI Qt4编程-创建自定义窗口部件 Qtqt4 通过Qt窗口部件进行子类化或者直接对QWidget进行子类化,就可以创建自定义窗口部件,下面示范两种方式,并且也会说明如何把自定义窗口部 ...
- Qt入门(15)——使用窗口部件
下面是如何创建一个你自己的窗口部件,描述如何控制一个窗口部件的最小大小和最大大小,并且介绍了窗口部件的名称. class MyWidget : public QWidget { public: MyW ...
- 调色板类QPalette——包含了Qt窗口不见的颜色组(collor group),和Windows右键属性外观非常类似
QPalette类包含了Qt窗口不见的颜色组(collor group); 1.Active组,该组的颜色用户当前活动的(active)窗口,即具有键盘或鼠标焦点的窗口; 2.Inactive组,该组 ...
- [Qt Creator 快速入门] 第3章 窗口部件
从这一章开始正式接触Qt的窗口部件.在第2章曾看到 Qt Creator 提供的默认基类只有 QMainWindow.QWidget 和 QDialog 这3种.QMainWindow 是带有菜单栏和 ...
- Qt入门(19)——自定义窗口部件
我们介绍可以画自己的第一个自定义窗口部件.我们也加入了一个有用的键盘接口.我们添加了一个槽:setRange(). void setRange( int minVal, int maxV ...
- Qt自定义窗口部件
QtDesigner自定义窗口部件有两种方法:改进法(promotion)和插件法(plugin) 改进法 1.改进法之前,要先写好子类化QSpinBox后的HexspinBox.h和Hexs ...
随机推荐
- Windows应用程序的消息处理机制
(1)操作系统接收到应用程序的窗体消息,将消息投递到该应用程序的消息队列中. (2)应用程序在消息循环中调用GetMessage函数从消息队列中取出一条一条的消息. 取出消息后,应用程序能够对消息进行 ...
- Sleep(0)的妙用
在线程中,调用sleep(0)可以释放cpu时间,让线程马上重新回到就绪队列而非等待队列,sleep(0)释放当前线程所剩余的时间片(如果有剩余的话),这样可以让操作系统切换其他线程来执行,提升效率. ...
- ant的condition任务
1.istrue isfalse:断言 真 假 <project name="testCondition"> <target name="test&qu ...
- Spring实战5-基于Spring构建Web应用
主要内容 将web请求映射到Spring控制器 绑定form参数 验证表单提交的参数 写在前面:关于Java Web,首先推荐一篇文章——写给java web一年左右工作经验的人,这篇文章的作者用精练 ...
- Material Design: NavigationView FlaotingActionBar SnackBar采用
转载 请明确说明 MingsangAndroid 本文介绍了Design Support Library的引入 拥抱Android Design Support Library新变化(导航视图.悬浮A ...
- delphi 中的函数指针 回调函数(传递函数指针,以及它需要的函数参数)
以下代码仅仅是测试代码:delphi XE7 UP1 interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.V ...
- so文件成品评论【整理】
这是我的 @布加迪20 AZ在一篇文章中写道:<汉化so文件的心得>中的技术附件做的简洁性整理.原来的看起来不是非常方便.一起分享学习.. 正文 SO文件汉化心得 --By布加迪20 ...
- Asp.NetCore程序发布到CentOs(含安装部署netcore)--最佳实践
原文:Asp.NetCore程序发布到CentOs(含安装部署netcore)--最佳实践 环境 本地 win7 服务器:Virtual Box 上的Centos ssh工具: Xshell 文件传输 ...
- Smali相关的基础知识点
通过本篇博客的学习,相信你可以无压力的读懂Smali语言文件,并可以将Smali还原成java!!! 其实Smali语言并不是很难,如果你有一些汇编指令的基础,学习Smali就更加简单了,有兴趣的可以 ...
- OpenGL中GLSL渲染茶壶光照完整程序
顶点着色器VertexShader.txt: uniform vec3 lightposition;//光源位置 uniform vec3 eyeposition;//相机位置 uniform vec ...