您的位置:首页 > 其它

第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

#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) );

编译和运行

当你尝试运行程序新代码将被重新编译。测试程应用序添加电台。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: