原文网址: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图标。
引入类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) );
编译和运行
当你尝试运行程序新代码将被重新编译。测试程应用序添加电台。