关于QT的绘图

最近研究了关于QT的绘图的相关的知识,下面来总结下:

QT设置控件的颜色有以下几种方式:

1. QPalette (调色板)

QPalette类包含每个小部件状态的颜色组。调色板由三个颜色组组成:活动的、禁用的和非活动的。Qt中的所有小部件都包含一个调色板,并使用它们的调色板绘制自己。这使得用户界面易于配置和保持一致。如果您创建了一个新的小部件,我们强烈建议您使用调色板中的颜色,而不是硬编码特定的颜色。颜色组:活动组用于具有键盘焦点的窗口。非活动组用于其他窗口。禁用组用于由于某种原因禁用的小部件(不是窗口)。活动窗口和非活动窗口都可以包含禁用的小部件。(禁用的小部件通常被称为不可访问的或灰色的。)在大多数样式中,Active和Inactive看起来是相同的。可以使用setColor()和setBrush()为调色板的任何颜色组中的特定角色设置颜色和画笔。颜色组包含小部件用于绘图的一组颜色。我们建议小部件使用调色板中的颜色组角色,比如“前景”和“基础”,而不是像“红色”或“绿松石色”这样的文字颜色。颜色角色在ColorRole文档中枚举并定义。我们强烈建议您使用当前样式的默认选项板(由QApplication::palette()返回)并根据需要修改它。这是由Qt的小部件绘制完成的。要修改一个颜色组,您可以调用setColor()和setBrush()函数,这取决于您想要纯色还是位图模式。还有相应的color()和brush() getter,以及一个常用的方便函数来获取当前ColorGroup的ColorRole: window()、windowText()、base()等。您可以使用copy构造函数复制调色板,并使用isCopyOf()测试两个调色板是否相同。QPalette是通过使用隐式共享进行优化的,因此将QPalette对象作为参数传递是非常有效的。警告:有些样式不会为所有绘图使用调色板,例如,如果它们使用本机主题引擎的话。Windows XP、Windows Vista和Mac OS X风格都是如此。

QPalette pale = label->palette();

pale.setColor(ColorRole, QColor); //ColorRole 代表是控件哪个位置上的颜色,例如控件的字体颜色,控件的背景颜色,控件的前景色等等。

label->setPalette(pale);

2.通过setstylesheet设置美化控件。

stylesheet是QT专门的为QT界面美化所设计的一个功能,采用QSS语言,这里不详细介绍,有需要的可自行前往了解。

3.通过paintEvent函数进行重绘。

说到重绘就必须得介绍QT的几个类 QPainter, QPaintdevice, QPaintEngine

QPainter类在小部件和其他绘画设备上执行低级别的绘画。QPainter提供了高度优化的函数来完成大部分图形界面程序所需要的工作。它可以画任何东西,从简单的线条到复杂的形状,比如馅饼和和弦。它还可以绘制对齐的文本和像素图。通常情况下,它会绘制一个“自然的”坐标系统,但它也可以进行视图和世界转换。QPainter可以操作继承了QPaintDevice类的任何对象。QPainter的常用用法是在一个小部件的绘制事件中:构造和定制(例如设置笔刷或笔刷)绘制器。然后画。记得在画完画后销毁QPainter对象。例如:

Widget::paintEvent(QPaintEvent *)

{

QPainter paint(this);

painter.setPen(Qt:blue);

painter.setFont(QFont(“Ubuntu”,30));

painter.drawText(rect(), Qt::AlignCenter,Qt);}

}

QPainter的核心功能是绘图,但是这个类还提供了一些功能,允许您自定义QPainter的设置及其呈现质量,以及其他支持裁剪的功能。此外,您还可以通过指定画家的构图模式来控制不同形状是如何合并在一起的。isActive()函数指示画家是否处于活动状态。painter被begin()函数和接受QPaintDevice参数的构造函数激活。函数end()和析构函数使其失效。QPaintDevice和QPaintEngine classes一起构成了Qt涂料体系的基础。QPainter是用来执行绘图操作的类。QPaintDevice表示可以使用QPainter来绘制的设备。QPaintEngine提供了画家用来绘制不同类型设备的界面。如果油漆工处于活动状态,device()返回油漆工绘制的油漆设备,paintEngine()返回油漆工当前操作的油漆引擎。有关更多信息,请参阅涂料系统。有时让别人在一个不寻常的QPaintDevice上作画是可取的。QPainter支持一个静态函数来完成这项工作,setredirect()。

警告:当绘制设备是小部件时,QPainter只能在paintEvent()函数或paintEvent()调用的函数中使用;除非设置了Qt::WA_PaintOutsidePaintEvent小部件属性。在Mac OS X和Windows上,您只能在paintEvent()函数中绘制,而不考虑该属性的设置。

 

QPaintDevice类是可以绘制的对象的基类。

绘画设备是一个可以用QPainter绘制的二维空间的抽象。它的默认坐标系的原点位于左上角。X向右增加Y向下增加。单位是一个像素。QPaintDevice的绘图功能目前由QWidget、QImage、QPixmap、QGLPixelBuffer、QPicture和QPrinter子类实现。要实现对新后端的支持,您必须从QPaintDevice派生并重新实现虚拟paintEngine()函数,以告诉QPainter应该使用哪个油漆引擎来绘制这个特定的设备。注意,您还必须创建一个相应的油漆引擎才能在设备i上绘制。e从QPaintEngine派生而来,重新实现其虚函数。警告:Qt要求QApplication对象在创建任何绘画设备之前存在。油漆设备访问窗口系统资源,这些资源在创建应用程序对象之前没有初始化。QPaintDevice类提供了几个函数来返回各种设备指标:depth()函数返回它的位深度(位平面数)。height()函数返回默认坐标系统单元的高度(例如QPixmap和QWidget的像素),而heightMM()函数返回以毫米为单位的设备高度。同样,width()和widthMM()函数分别以默认坐标系单元和毫米为单位返回设备的宽度。另外,还可以使用protected指标()函数通过指定所需的PaintDeviceMetric作为参数来检索指标信息。logicalDpiX()和logicalDpiY()函数返回设备的水平和垂直分辨率(单位为每英寸点数)。physicalDpiX()和physicalDpiY()函数还返回设备每英寸的点分辨率,但请注意,如果逻辑分辨率和物理分辨率不同,对应的QPaintEngine必须处理映射。最后,colorCount()函数返回油漆设备可用的不同颜色的数量。

PaintDevice着重介绍QPixmap, QImage。

QPixmap专门针对如何把图形画到界面上去做了优化,它的实现与画图的硬件设备直接相关,因此他只能在GUI主线程中使用。

QImage类提供了一种硬件无关的图像表示,允许直接访问像素数据,并且可以用作绘图设备。Qt提供了四个处理图像数据的类:QImage、QPixmap、QBitmap和QPicture。QImage用于I/O和直接像素访问和操作,QPixmap用于在屏幕上显示图像。QBitmap只是继承了QPixmap的一个方便类,它保证了深度为1。最后,QPicture类是一个记录和回放QPainter命令的绘图设备。因为QImage是一个QPaintDevice子类,所以QPainter可以直接绘制到图像上。在QImage上使用QPainter时,可以在另一个线程中进行绘制,而不是在当前GUI线程中。QImage类支持Format enum描述的几种图像格式。这些包括单色、8位、32位和alpha混合的图像,在Qt 4.x的所有版本中都可以使用。QImage提供了一组函数,可用于获取关于图像的各种信息。还有几个功能可以实现图像的转换。QImage对象可以通过值传递,因为QImage类使用隐式数据共享。QImage对象也可以进行流和比较。

因此我们处理较复杂的图像时可以先通过Qimage把图像大小,图案等先处理好,再直接转换到QPixmap上,进行绘制可提高绘制效率。

其中据我测试过:三种设置颜色的优先级: paintEvent > stylesheet > QPalette 。优先级的原因正在学习中,有搞清楚的同学可以相互交流。

注:原创文章,转载请标明出处,谢谢!

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值