通过Qt窗口部件进行子类化或者直接对QWidget进行子类化,就可以创建自定义窗口部件,下面示范两种方式,并且也会说明如何把自定义窗口部件集成到Qt设计师中,这样就可以像使用内置的Qt窗口部件一样来使用它们,最后展示使用双缓冲技术(一种用于快速绘制的强大技术)的自定义窗口部件。
1.自定义Qt窗口部件
我们发现Qt窗口部件需要更多的自定义定制,这些定制可能要比它在Qt设计师里设置的属性或者对它调用的那些函数更多一些,一个简单而直接的解决方法就是对相关的窗口部件类进行子类化并且使它能够满足我们的需要。
如果没有任何一个Qt窗口部件能够满足任务要求,并且也没有办法通过组合现有窗口部件来满足所需的期望结果时,仍旧可以创建出我们想要的窗口部件来,要实现这一点,只需通过子类化QWidget,并且通过重新实现一些用来绘制窗口部件和响应鼠标点击的时间处理器即可,这一方法给了我们定义并且控制自己的窗口部件的外观和行为的完全*。Qt的一下内置窗口部件,像QLabel/QPushButton/QTableWidget,都是通过这种方法得以重新实现的。如果它们没有在Qt中存在,那么还是完全有可能以与平台无关的方式使用QWidget锁提供的共有函数来创建它们。
#include<QColor>
#include<QImage>
#include<QWidget>
class IconEditor:public QWidget
{
Q_OBJECT
//声明自定义属性,每个属性都有一个数据类型/一个读函数/一个可选项的写函数
Q_PROPERTY(QImage iconImage READ iconImage WRITE setIconImage)
}
当我们在Qt设计师中使用这个窗口部件时,在Qt设计师属性编辑框里,那些继承于QWidget的属性下面,将会显示这些自定义的属性,这些属性可以是由QVariant锁所支持的任何类型。
IconEditor::IconEditor(QWidget *parent) : QWidget(parent)
{
setAttribute(Qt::WA_StaticContents);
setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
//画笔的颜色设置为黑色
curColor = Qt::black;
//缩放因子设置为8,图标中的每一个像素都将会显示成一个8×8正方形。
zoom = 8;
//图片初始化为16×16的像素大小和32位的ARGB颜色格式,这种颜色支持半透明效果。
image = QImage(16, 16, QImage::Format_ARGB32);
//通过填充透明的颜色,从而清空image中的数据。
image.fill(qRgba(0, 0, 0, 0));
}
QRgb只是unsigned int 类型的一个typedef(类型别名),并且qRgb()和qRgba()都是用来把它们的参数组合成一个32位的QRGB整数值的内联函数,格式如下。
QRgb red = 0xFFFF0000;
这里的第一个FF对应于alpha分量,第二个FF对应于红色分量。
Qt提供了两种存储颜色的类型:QRgb和QColor。虽然QRgb仅仅是一个用于QImage中存储32位像素数据的类型别名,但QColor则是一个具有许多有用函数并且在Qt中广泛用于存储颜色的类。
QSize IconEditor::sizeHinit() const //从QWidget中重新实现的,并且可以返回一个窗口部件的理想大小
{
QSize size = zoom * image.size();
//如果缩放因子是3或者更大,那么在每个方向上需要再额外增加一个像素,以便可以容纳一个网格线。如果缩放因子是2或者1,就不必再显示网格线,因为这些网格线将几乎不能再给图标的像素留下任何空间。
if (zoom >= 3)
{
size += QSize(1,1);
}
return size;
}
void IconEditor::setIconImage(const QImage &newImage) //设置需要编辑的图像
{
if (newImage != image)
{
//转换成一个带alpha缓冲的32位图像
iamge = newImage.convertFormat(QImage::Format_ARGB32);
//强制重绘窗口部件
update();
//告诉包含这个窗口部件的任意布局,这个窗口部件的大小提示发生了变化了,于是,该布局将会自动适应这个新的大小提示。
updateGeometry();
}
}
窗口部件的调色板颜色组
(1)Active颜色组可用于当前激活窗口中的那些窗口部件。
(2)Inactive颜色组可用于其他窗口中的那些窗口部件。
(3)Disabled颜色组可用于任意窗口中的那些不可用窗口部件。
2.双缓存
双缓存是一种图像用户界面编程技术,它包括把一个窗口部件渲染到一个脱屏像素映射中以及把这个像素映射复制到显示器上,在Qt的早期版本中,这种技术通常用于消除屏幕的闪烁以及为用户提供一个漂亮的用户界面。
Qt提供了两种用于控制鼠标光标形状的机制
(1).当鼠标悬停在某个特殊的窗口部件上时,QWidget::setCursor()可以设置它所使用的光标形状,如果没有为窗口部件专门设置光标,那么就会使用父窗口部件中的光标,顶层窗口部件的默认光标是箭头光标。
(2)对于整个应用程序中所使用的光标形状,可以通过QApplication::setOverrideCursor()进行设置,它会把不同窗口部件中的光标形状全部覆盖掉,直到调用restoreOverrideCursor‘()。