一、QGradient

该类是渐变画刷相关的类,有三个子类,分别是QConicalGradient、QRadialGradient和QLinearGradient

  1、QConicalGradient是圆锥画刷;通过确定中心点,然后以跟初始轴的夹角位置,向两边扩散;x轴是中心点水平向右;angle是相对x轴的位置作为起始点

QConicalGradient(const QPointF &center, qreal angle)

    QConicalGradient coneGradient(,,-90.0);
coneGradient.setColorAt(0.0,Qt::darkGray);
coneGradient.setColorAt(0.2,niceBlue);
coneGradient.setColorAt(0.5,Qt::white);
coneGradient.setColorAt(1.0,Qt::darkGray);

是以(0,0)位置为原点,相对x轴-90度,则相当于-Y轴方向为起始点开始渲染颜色;

setColorAt的第一个参数x是指360*x所对应的角度作为起始位置向两边扩散,着指定的颜色;

  2、QRadialGradient是同心圆画刷;通过指定中心位置,然后指定跟中心点距离,假定全长为1,进行扩散;这个函数有两个中心点;center和focalPoint;center指定了实际的圆心;focalPoint则是指在渲染颜色的时候的圆心;如下两张图所示

QRadialGradient haloGradient(,,,0,0);
QRadialGradient haloGradient(,,,30,30);

这里通过修改如上标注的不同参数而产生的结果;虽然第二个把坐标设置成了30,但是因为半径只有20,所以实际是QRadialGradient haloGradient(0,0,20,20,20);

QRadialGradient(const QPointF &center, qreal radius, const QPointF &focalPoint)

center跟radius限定了0~1之间要的着色区域;focalPoint则指定了渲染的位置;假设center = (0,0),radius=20,focalPoint=(20,0); 则渲染的时候的每一个点是以(20,0)为圆心,跟以center和radius为圆的圆边的距离进行计算当前要的着色;比如haloGradient.setColorAt(0.9, Qt::white); 则其中一个白色点向左右两边扩散的是在X轴上面;位置是((20+20)*0.9,0); 即:((radius+focalPoint.x)*0.9,0)

3、QLinearGradient是线性画刷;要指定以哪一条线为基准进行从a点到b渲染画刷;如下从start点到finalStop点进行渲染画刷;

QLinearGradient(const QPointF &start, const QPointF &finalStop)

二、世界变换;QTransform

它允许移动、缩放、旋转或者拉伸绘制的项;

如下则是旋转示例,加粗部分是对应的旋转的用法;

    QTransform transform;
for (int i = ; i <= MaxMinutes; ++i) {
transform.rotate(-i*DegreesPerMinute);
painter->setWorldTransform(transform);
if (i%== ) {
painter->setPen(thickPen);
painter->drawLine(,-,,-);
painter->drawText(-,-,,,
Qt::AlignHCenter|Qt::AlignTop,
QString::number(i));
} else {
painter->setPen(thinPen);
painter->drawLine(,-,,-);
}
transform.rotate(i*DegreesPerMinute);
}

上面代码显示的结果如下截图所示

QPainter里面也包含世界变换里面的简单函数;当只是进行简单旋转获得拉伸等操作的时候,直接使用painter进行操作即可;如下示例所示,也能达到上图的效果;

    for (int i = ; i <= MaxMinutes; ++i) {
painter->save();
painter->rotate(-i*DegreesPerMinute);
if (i%== ) {
painter->setPen(thickPen);
painter->drawLine(,-,,-);
painter->drawText(-,-,,,
Qt::AlignHCenter|Qt::AlignTop,
QString::number(i));
} else {
painter->setPen(thinPen);
painter->drawLine(,-,,-);
}
painter->restore();
}

问题及解决:

1、在mac编译的时候出现错误:Qt: error: symbol(s) not found for architecture x86_64 ;这个是因为函数声明了,但是实现该函数;

2、自己手写diagram的时候发生了一件奇怪的事情:add node的时候,界面上没有显示对应绘制的node图像,但是点击add node的位置的时候,node也是有响应的;所以只是没有在面板上显示出来,其他的都是对的:位置,还有响应函数等;综上分析说明应该是没有加载到视图类里面;原来我在写DiagramWindow的时候忘记将view->setScene(scene);这段话添加进去;

3、当拖动node的时候,线没有跟随移动;当设置断点在itemChange的时候,也没有在移动node的时候触发该函数;通过查找该flag:ItemPositionHasChanged的说明:The item's position has changed. This notification is sent if the ItemSendsGeometryChanges flag is enabled, and after the item's local position, relative to its parent, has changed. The value argument is the new position (the same as pos()), and QGraphicsItem ignores the return value for this notification (i.e., a read-only notification).













Qt Gui 第八章的更多相关文章

  1. 第八章 Qt GUI之对话框使用

    第八章 Qt GUI之对话框使用 对话框可以是模态(modal)的或非模态(modeless)两种.当我们在一个用户界面程序里面对一个对话框(比如选择文件对话框)的操作没有结束前,界面的其他窗口无法操 ...

  2. 保持Qt GUI响应的几种方法

    最开始使用Qt时就遇到过QT Gui失去响应的问题,我是用多线程的方式解决的,然而通常来说,多线程是会降低程序的运行速度. 之后,在使用QSqlQuery::execBatch()函数时,Qt Gui ...

  3. 自己的Qt GUI 项目+vs2013+opencv+caffe环境配置

    由于深度学习的种种优势,使我们对于深度学习的使用越来越频繁.很多时候,我们都需要在自己的项目中配置caffe环境,来调用caffe网络模型完成自己的任务.今天我主要讲的关于"在自己的项目中配 ...

  4. GNU Radio下QT GUI Tab Widget的使用方法

    期望显示出的效果: 即将要显示的图放在各自的标签页中. 整体框图: 具体设置: QT GUI Tab Widget的设置: 其中 ID改为自己想改的,这里我写的是display GUI Hint所代表 ...

  5. QT GUI @创建新的工程

    开发环境: Qt 4.5 Qt Creator 1.3.0 新工程创建步骤: 1. 单击运行Qt Creator,进入欢迎页面.选择"File" -> "New F ...

  6. 独立线程中实现QT GUI

    在网上搜集的资料: http://www.qtcentre.org/threads/16552-Starting-QT-GUI-in-a-seperate-Threadhttp://stackover ...

  7. 基于Qt Gui的Led控制显示程序

    基于arm + linux的嵌入式软件开发,基本上的内容主要是:u-boot的移植,kernel的裁剪和相关驱动程序的设计,root-fs的制作,应用程序的设计,其中,应用程序主要包含两方面的内容:G ...

  8. Qt GUI@学习日志

    day 1: Qt中类: 理解一个类最好还是从其类代码实现上看. 由此图可看出需要好好研究那几个重要的类:Qt/QEvent/QObject/QWidget/. QApplication: (比较复杂 ...

  9. QT GUI总结

      QT提供了设计师工具,可以很方便的使用鼠标拖拽的方式绘制界面.绘制完毕后自动生成一个界面的.h文件(如ui_mainwindow.h),其中含有一个自动生成的Ui_MainWindow类,这个类中 ...

随机推荐

  1. js—二进制中1的个数

    题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 做题思路 代码 function NumberOf1(n) { // write code here var cnt = 0 ...

  2. clr via c# 程序集加载和反射集(一)

    1,程序集加载---弱的程序集可以加载强签名的程序集,但是不可相反.否则引用会报错!(但是,反射是没问题的) //获取当前类的Assembly Assembly.GetEntryAssembly() ...

  3. 戏说前端之CSS编码规范

    前言 项目启动时 css 应该注意哪些问题 文件名规范 文件名建议用小写字母加中横线的方式.为什么呢?因为这样可读性比较强,看起来比较清爽,像链接也是用这样的方式,例如 // 地址: github的地 ...

  4. css如何玩转有序无序列表项list样式

    在无序列表ul>li中,无线列表的标志是出现在各列表前面的圆点.在有序列表ol>li中,前面默认带有数字,如何修改列表前面的项目符号,只需要通过list-style调整就好,常见的符号有( ...

  5. SAP S4HANA里委外加工采购功能的变化

    SAP S4HANA里委外加工采购功能的变化 [Part 1:主要变化点] 1.1,采购订单界面上的变化, 1.2, 新的事务代码: ME2ON (Subcontracting Cockpit), 1 ...

  6. Android中点击按钮获取string.xml中内容并弹窗提示

    场景 AndroidStudio跑起来第一个App时新手遇到的那些坑: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103797 ...

  7. Spark组件间通信

    1.Spark组件之间使用RPC机制进行通信.RPC的客户端在本地编写并调用业务接口,接口在本地通过RPC框架的动态代理机制生成一个对应的实现类,在这个实现类中完成soket通信.远程调用等功能的逻辑 ...

  8. centos5,6的GRUB简介

    grub:GRand Unified Bootloader grub 0.x:grub legacy(centos5,6) grub 1.x:grub2(centos7) grub legacy(gr ...

  9. 特殊符号unicode编码

    包括箭头类.基本形状类.货币类.数学类.音乐符号类.对错类.星星类.星座类.国际象棋类.扑克牌类.希腊字母.十字类.法律符号.标点符号,详情见以下网址:http://caibaojian.com/un ...

  10. opencv —— floodFill 漫水填充法 实现证件照换背景

    漫水填充:floodFill 函数 简单来说,漫水填充就是自动选中与种子像素相连的区域,利用指定颜色进行区域颜色填充.Windows 画图工具中的油漆桶功能和 Photoshop 的魔法棒选择工具,都 ...