通过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‘()。

C++ GUI Qt4编程-创建自定义窗口部件的更多相关文章

  1. C++ GUI Qt4 编程 (第二版)

    [加拿大]JasminBlanchette [英]MarkSummerfield . 电子工业 2008. 前几天的问题多是因为版本不兼容的问题. QT本身Q4 Q5就有版本问题,然后集成到VS08 ...

  2. C++ GUI Qt4编程(10)-3.4spreadsheet

    1. C++ GUI Qt4编程第三章,增加spreadsheet. 2. spreadsheet.h /**/ #ifndef SPREADSHEET_H #define SPREADSHEET_H ...

  3. Qt入门(19)——自定义窗口部件

    我们介绍可以画自己的第一个自定义窗口部件.我们也加入了一个有用的键盘接口.我们添加了一个槽:setRange().        void setRange( int minVal, int maxV ...

  4. C++ GUI Qt4编程(09)-3.3spreadsheet-toolbar

    1. C++ GUI Qt4编程第三章,增加工具栏.状态栏和快捷键. 2. mainwindow.h /**/ #ifndef MAINWINDOW_H #define MAINWINDOW_H #i ...

  5. C++ GUI Qt4编程(03)-1.3layout

    1. 根据C++ GUI Qt4编程(第二版)整理2. 系统:centos7:  Qt版本:5.5.13. 程序:layout.cpp #include <QApplication> #i ...

  6. Qt自定义窗口部件

    QtDesigner自定义窗口部件有两种方法:改进法(promotion)和插件法(plugin)   改进法   1.改进法之前,要先写好子类化QSpinBox后的HexspinBox.h和Hexs ...

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

    1. 框架代码 用 PyCharm 新建一个名为 SimplePaintApp 的项目,然后新建一个名为 simple_paint_app.py 的 Python 源文件, 在代码编辑器中,输入以下框 ...

  8. C++ GUI Qt4编程(08)-3.2spreadsheet-resource

    1. C++ GUI Qt4编程第三章,图片使用资源机制法. 2. 步骤: 2-1. 在resource文件夹下,新建images文件,存放图片. 2-2. 新建spreadsheet.qrc文件,并 ...

  9. C++ GUI Qt4编程(07)-3.1menu

    1. C++ GUI Qt4编程第三章,添加menu菜单. 2. mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include < ...

随机推荐

  1. HTML和JS完成页面点击四个角弹出管理页面

    实现方法1: HTML代码: <div class="top-left-corner"></div> <div class="top-rig ...

  2. 浅谈防火墙对FTP的影响及故障排除

    本文转载自:http://www.cnblogs.com/emanlee/archive/2013/01/07/2849680.html  向作者致敬! TP是常见的基于TCP的网络服务,它使用了两个 ...

  3. 阶段2 JavaWeb+黑马旅游网_15-Maven基础_第4节 maven生命周期和概念模型图_09maven概念模型图

    项目自身的信息 项目运行所依赖的扎包 运行环境信息:tomcat啊,JDK啊这些都属于运行环境 一个jar包的坐标由三个最基本的信息组成. 第一部分就是依赖管理. 第二个部分

  4. 封装一个windows转发端口的脚本

    使用方法: 1.打开文本编辑工具如(Notepad++) 2.新建文件 3.注意:修改文本的编码字符集为:gb2312 4.将下面代码 复制入文件 5.保存文件名为:transmit.bat 6.双击 ...

  5. PHP操作SESSION

    说一下在PHP里面怎么简单的操作SESSION 操作SESSION流程 <?php session_start(); //开启session $_SESSION['user']='admin'; ...

  6. Vue 2.0 入门系列(14)学习 Vue.js 需要掌握的 es6 (1)

    针对之前学习 Vue 用到的 es6 特性,以及接下来进一步学习 Vue 要用到的 es6 特性,做下简单总结. var.let 与 const var 与 let es6 之前,JavaScript ...

  7. 【错误】jsp查询字符串中空格导致的异常问题!

    jsp中查询字符串中空格问题 jsp中查询字符串中参数名的等号右边最好不要出现空格,因为编译器会把他当做是参数值得一部分. 例如: <a href="adjust.jsp?number ...

  8. P1106删数游戏

    这道题曾经在CQOJ上考过,是第二次做了. 这是一道使用字符串的贪心题.首先要根据机组例子来确定:删除递增序列的最后一位.即循环找到那一位后,把后面的数往前压.所以我在艰难处理完双重循环后(这个处理不 ...

  9. 猿题库 iOS 客户端架构设计(原文地址:http://gracelancy.com/blog/2016/01/06/ape-ios-arch-design/)

    猿题库 iOS 客户端架构设计 序 猿题库是一个拥有数千万用户的创业公司,从2013年题库项目起步到2015年,团队保持了极高的生产效率,使我们的产品完成了五个大版本和数十个小版本的高速迭代.在如此快 ...

  10. Apache 配置内网站点

    基于端口常用于内部网站,不对外开发的网站 [root@Nagios-Server extra]# vim ../httpd.conf Listen 80 Listen 8000 Listen 9000 ...