第5部份:在显示区域上绘画
2013-05-24 16:50
134 查看
原文网址:http://www.dazzle.plus.com/linux/QtCreator/part05.htm
第5部份:在显示区域上绘画
在图形视图场景上添加项
现在,我们要增强我们的应用程序,允许用户通过点击中央显示区域添加小图标,来模拟无线电台。
将绘制的图形项添加到我们之前创建的图形视图场景上。每一项都是继承Qt类QGraphicsItem的新类Station的实例。
添加新类
和之前的做法一样把新类“Sation”添加到项目里。使用QtCreator文件菜单中的“新建...”向导。选择“c++类”,填好类名按“下一步”按钮,然后按“完成”按钮。
为了实现所需的代码,使用下面的代码替换由QtCreator创建的模板代码。
station.h
我们的类继承QGraphicsItem,现在只需要三个公共函数。一个简单的构造函数带两个浮点型的参数设置x和y坐标,一个是实现画图标的paint虚函数,最后一个boundingRect虚函数是定义每个图标绘制的外部边框。
我们的boundingRect虚函数返回一个矩形比我们将要画的图标稍大,由于它的代码比较简单就定义在头文件里。
station.cpp
构造函数里我们根据x和y传递的参数设置坐标。在paint函数绘制我们的电台图标。
增强scene
现在为类Scene增强一些简单的功能当用户在中央显示区域每次点击时会显示Station图标。
scene.cpp
引入类Station的头文件。
在构造函数里我们需要在(0,0)处添加一个不可见的项作为场景的初始锚。如里没有这样做,Qt默认会把用户添加第一个电台作为左上角定位的锚,后面添加的电台位置并不是用户所想的。
在mousePressEvent方法中判断哪个按钮被按下的代码后面加上下面的这几行新代码。每次点击鼠标按键,将添加一个电台并且发送相应的消息。
编译和运行
当你尝试运行程序新代码将被重新编译。测试程应用序添加电台。
第5部份:在显示区域上绘画
在图形视图场景上添加项
现在,我们要增强我们的应用程序,允许用户通过点击中央显示区域添加小图标,来模拟无线电台。
将绘制的图形项添加到我们之前创建的图形视图场景上。每一项都是继承Qt类QGraphicsItem的新类Station的实例。
添加新类
和之前的做法一样把新类“Sation”添加到项目里。使用QtCreator文件菜单中的“新建...”向导。选择“c++类”,填好类名按“下一步”按钮,然后按“完成”按钮。
为了实现所需的代码,使用下面的代码替换由QtCreator创建的模板代码。
station.h
#ifndef STATION_H #define STATION_H #include <QGraphicsItem> /*************************************************************************************/ /******************* 模拟的无线电台 ********************/ /*************************************************************************************/ class Station : public QGraphicsItem { public: Station( qreal, qreal ); // 构造函数 void paint( QPainter*, const QStyleOptionGraphicsItem*, QWidget* ); // paint虚函数 QRectF boundingRect() const { return QRectF(-6.5, -13, 13, 18); } // boundingRect虚函数 }; #endif // STATION_H
我们的类继承QGraphicsItem,现在只需要三个公共函数。一个简单的构造函数带两个浮点型的参数设置x和y坐标,一个是实现画图标的paint虚函数,最后一个boundingRect虚函数是定义每个图标绘制的外部边框。
我们的boundingRect虚函数返回一个矩形比我们将要画的图标稍大,由于它的代码比较简单就定义在头文件里。
station.cpp
#include "station.h" #include <QPainter> /*************************************************************************************/ /******************* 模拟无线电台 ********************/ /*************************************************************************************/ /************************************ 构造函数 *************************************/ Station::Station( qreal x, qreal y ) : QGraphicsItem() { // 设置电台位图和位置 setPos( x, y ); } /************************************** 绘图 ****************************************/ void Station::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { //绘制电台图标,必须小于边框矩形 painter->setRenderHint( QPainter::Antialiasing ); painter->setPen( QPen( Qt::black, 2 ) ); painter->drawRect( -4, -3, 8, 7 ); painter->drawLine( 0, -4, 0, -11 ); painter->drawLine( -5, -11, 0, -6 ); painter->drawLine( +5, -11, 0, -6 ); }
构造函数里我们根据x和y传递的参数设置坐标。在paint函数绘制我们的电台图标。
增强scene
现在为类Scene增强一些简单的功能当用户在中央显示区域每次点击时会显示Station图标。
scene.cpp
引入类Station的头文件。
#include "station.h"
在构造函数里我们需要在(0,0)处添加一个不可见的项作为场景的初始锚。如里没有这样做,Qt默认会把用户添加第一个电台作为左上角定位的锚,后面添加的电台位置并不是用户所想的。
// 创建一个不可见项为作场景默认的左上角锚 addLine( 0, 0, 0, 1, QPen(Qt::transparent, 1) );
在mousePressEvent方法中判断哪个按钮被按下的代码后面加上下面的这几行新代码。每次点击鼠标按键,将添加一个电台并且发送相应的消息。
// 在用户点击场景的位置新建一个电台 qreal x = event->scenePos().x(); qreal y = event->scenePos().y(); addItem( new Station( x, y ) ); // 发送信息 emit message( QString("Station add at %1,%2").arg(x).arg(y) );
编译和运行
当你尝试运行程序新代码将被重新编译。测试程应用序添加电台。
相关文章推荐
- 在html 的img属性里只显示图片的部分区域(矩形,给出开始点和结束点),其他部份不显示,也不要拉伸
- 第3部份:添加一个显示区域
- 点九图片的显示内容区域应作何理解
- 横向重复区域显示二法
- 指定上下文中可显示区域
- 地图组件上的自定义区域叠加层显示 ArcGis + GeoJson
- 只显示CCLayer部分特定区域的方法
- msgbox.js的修改使在iframe的可视区域显示
- 关于CListCtrl 中只显示图标,不显示文字区域的解决方法
- JS实现当前编辑行自动滚动至div显示区域
- javascript 同一个页面转向,显示到指定区域
- 指定区域显示图片
- 显示,隐藏某一区域
- 使用UILocalizedIndexedCollation实现区域索引排序 及 不显示没有数据的区域
- iOS根据坐标数据点所在的坐标区域来动态显示到可视范围
- 【HTML】使用iframe标签显示目标网页(内容)的指定区域(转)
- 【HTML】使用iframe标签显示目标网页(内容)的指定区域
- MFC对话框扩展区域显示(可伸缩对话框区域)
- 刷新页面让显示区域回到顶部
- Iframe标签显示目标网页中某区域内容的实现方法