自定义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

时间: 2024-10-27 12:54:36

自定义QT窗口部件外观之QStyle的相关文章

Qt窗口部件及子部件

QWidget类是所有用户界面对象的基类,被称为基础窗口部件. #include <QApplication> #include<QLabel> #include<QWidget> int main(int argc, char *argv[]) { QApplication a(argc, argv); // 新建QWidget类对象,默认parent参数是0,所以它是个窗口 QWidget *widget = new QWidget(); // 设置窗口标题 wid

如何获得 Qt窗口部件在主窗口中的位置--确定鼠标是否在某一控件上与在控件上的位置

用Qt Creator 设计程序时,最方便的就是ui设计器,可以很容易的得到想要的布局. 但是这样自动布局带来的后果是很难知道窗口中某一部件在主窗口中的相对位置. 在处理子窗口鼠标事件时变的很麻烦.主窗口有菜单.工具条等,想用鼠标绘图, 把鼠标轨迹映射到窗口部件上,这些问题. 其实最主要的是获得窗口部件的起始点相对主窗口的位置. 例如:在主窗口拖入一个QScrollArea 在其上放一个QLabel用来显示鼠标事件. 可以在ui对象结构上看到如下结构. 大家知道,我们可以用pos()来获得某一窗

C++ GUI Qt4编程-创建自定义窗口部件

C++ GUI Qt4编程-创建自定义窗口部件 Qtqt4 通过Qt窗口部件进行子类化或者直接对QWidget进行子类化,就可以创建自定义窗口部件,下面示范两种方式,并且也会说明如何把自定义窗口部件集成到Qt设计师中,这样就可以像使用内置的Qt窗口部件一样来使用它们,最后展示使用双缓冲技术(一种用于快速绘制的强大技术)的自定义窗口部件. 1.自定义Qt窗口部件 我们发现Qt窗口部件需要更多的自定义定制,这些定制可能要比它在Qt设计师里设置的属性或者对它调用的那些函数更多一些,一个简单而直接的解决

Qt自定义窗口部件

QtDesigner自定义窗口部件有两种方法:改进法(promotion)和插件法(plugin) 改进法 1.改进法之前,要先写好子类化QSpinBox后的HexspinBox.h和HexspinBox.cpp文件.把这两个文件拷贝到想要的项目中. HexspinBox.h Cpp代码   #ifndef HEXSPINBOX_H #define HEXSPINBOX_H #include <QSpinBox> class QRegExpValidator; class HexSpinBox

【Qt学习笔记】窗口部件整理

关于Qt中窗口部件的学习 今天开始学习Qt的窗口部件,领略一下Qt的神奇之处,记得2012年的那年冬天,我还学Java呢,现在基本上和Java说再见了,不过对于嵌入式的开发Qt还是举足轻重的,我想趁着假期的时间,好好学习.考研之后发现一个问题,无论当初你学的有多明白,总会忘记,最好的方法就是将他们记录下来,甚至写下你当时的心情,如果有一天你需要了,回过头来看看,是一笔不错的财富. 1. QDialog类对话框 1.1 模态和非模态对话框 对于对话框,有模态(modal)和非模态(modeless

Kivy 中文教程 实例入门 简易画板 (Simple Paint App):1. 自定义窗口部件 (widget)

1. 框架代码 用 PyCharm 新建一个名为 SimplePaintApp 的项目,然后新建一个名为 simple_paint_app.py 的 Python 源文件, 在代码编辑器中,输入以下框架代码 1 from kivy.app import App 2 from kivy.uix.widget import Widget 3 4 5 class MyPaintWidget(Widget): 6 pass 7 8 9 class MyPaintApp(App): 10 def buil

QT之窗口部件及窗口类型

今天我们来继续学习QT的相关知识,本文的内容是介绍QT的窗口部件及窗口类型. 先说下窗口组件,图形用户界面由不同的窗口和窗口组件构成,一般是在<QtGui>中包含,对应Qt中的GUI模块:Qt以组件对象的方式构建图形用户界面:组件的类型分为两种:1.容器类(父组件),用于包含其他的界面组件.2.功能类(子组件),这个是用于实现特定的交互功能. **Qt中没有父组件的顶级组件叫做窗口!!!** 以下图为例,我们进行说明: QWidget 类继承自 QObject 类和 QPaintDevice

自定义窗口部件--Custom widget

通过继承的手段,子类原有的窗口部件 (1)改进法(promotion):新建一个项目,在UI界面拖QSpinBox部件到窗体中,右键点击部件.在弹出菜单中,选择“提升为”.(把下面两个文件加到项目中) #ifndef HEXSPINBOX_H #define HEXSPINBOX_H #include <QSpinBox> class QRegExpValidator; class HexSpinBox:public QSpinBox { Q_OBJECT public: HexSpinBox

Tkinter类之窗口部件类

Tkinter类之窗口部件类 Tkinter支持15个核心的窗口部件,这个15个核心窗口部件类列表如下: 窗口部件及说明: Button:一个简单的按钮,用来执行一个命令或别的操作. Canvas:组织图形.这个部件可以用来绘制图表和图,创建图形编辑器,实现定制窗口部件. Checkbutton:代表一个变量,它有两个不同的值.点击这个按钮将会在这两个值间切换. Entry:文本输入域. Frame:一个容器窗口部件.帧可以有边框和背景,当创建一个应用程序或dialog(对话)版面时,帧被用来组