博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
QT:使用“状态模式”绘制界面 参考的一种面向对象的绘制图片的方法
阅读量:7220 次
发布时间:2019-06-29

本文共 3511 字,大约阅读时间需要 11 分钟。

hot3.png

 QT与很多GUI库不同(如MFC),它不能随时随地地在界面上画图,只能在界面类的painterEvent中画图,如此一来,想在绘制QT界面时使用状态模式(GOF的23种设计模式之一)就有点困难了,作为解决方案,我先把要界面上的图片绘制在一张图片上(QPixmap),然后再在painterEvent中将Pixmap“画”到界面上。以下是这种方法的一个小例子。

#include 
//状态类的基类,定义了各个公用接口,//其中,SetPixmap是一个纯虚接口class BasePen{protected: //这三个类成员理应是BasePen的私有成员,然后通过接口访问 //我这里为了方便,直接把它们设为保护成员了 QPixmap m_Pixmap; QPoint m_StartPoint; QPoint m_EndPoint; virtual void SetPixmap() = 0;public: BasePen() { m_StartPoint = m_EndPoint = QPoint(0, 0); m_Pixmap = QPixmap(500, 500); } void SetStartPoint(QPoint point) { m_StartPoint = point; } void SetEndPoint(QPoint point) { m_EndPoint = point; SetPixmap(); } QPixmap GetPixmap() { return m_Pixmap; }};//矩形类,在界面上画一个红色的矩形class RectPen : public BasePen{protected: void SetPixmap() { m_Pixmap.fill(Qt::white); QPainter painter(&m_Pixmap); QRect rect(m_StartPoint, m_EndPoint); painter.setPen(Qt::red); painter.drawRect(rect); }};//直线类,在界面上画一条蓝色的直线class LinePen : public BasePen{protected: void SetPixmap() { m_Pixmap.fill(Qt::white); QPainter painter(&m_Pixmap); painter.setPen(Qt::blue); painter.drawLine(m_StartPoint, m_EndPoint); }};//圆形类,在界面上画一个绿色的椭圆class CirclePen : public BasePen{protected: void SetPixmap() { m_Pixmap.fill(Qt::white); QPainter painter(&m_Pixmap); QRect rect(m_StartPoint, m_EndPoint); painter.setPen(Qt::green); painter.drawEllipse(rect); }};class Widget : public QWidget{ Q_OBJECTprivate: bool m_MouseDown; BasePen *m_BasePen; RectPen *m_RectPen; LinePen *m_LinePen; CirclePen *m_CirclePen; //在界面上放三个按钮,用来控制画图状态 QRadioButton *m_LineButton; QRadioButton *m_RectButton; QRadioButton *m_CircleButton;protected: void mousePressEvent(QMouseEvent *event); void mouseMoveEvent(QMouseEvent *event); void mouseReleaseEvent(QMouseEvent *event); void paintEvent(QPaintEvent *event);public: Widget(QWidget *parent = 0); ~Widget(); private slots: void ClickedLineButton() { m_BasePen = m_LinePen; } void ClickedRectButton() { m_BasePen = m_RectPen; } void ClickedCircleButton() { m_BasePen = m_CirclePen; }};Widget::Widget(QWidget *parent /* = 0 */): QWidget(parent){ m_MouseDown = false; m_RectPen = new RectPen; m_LinePen = new LinePen; m_CirclePen = new CirclePen; m_LineButton = new QRadioButton("Line", this); m_RectButton = new QRadioButton("Rect", this); m_CircleButton = new QRadioButton("Circle", this); m_LineButton->move(10, 10); m_RectButton->move(100, 10); m_CircleButton->move(200, 10); connect(m_LineButton, SIGNAL(clicked()), this, SLOT(ClickedLineButton())); connect(m_RectButton, SIGNAL(clicked()), this, SLOT(ClickedRectButton())); connect(m_CircleButton, SIGNAL(clicked()), this, SLOT(ClickedCircleButton())); m_BasePen = m_LinePen; m_LineButton->setChecked(true); setFixedSize(500, 500);}Widget::~Widget(){ delete m_LinePen; delete m_RectPen; delete m_CirclePen;}void Widget::mousePressEvent(QMouseEvent *event){ if( event->button() == Qt::LeftButton ) { m_MouseDown = true; m_BasePen->SetStartPoint(event->pos()); }}void Widget::mouseMoveEvent(QMouseEvent *event){ if( m_MouseDown ) { m_BasePen->SetEndPoint(event->pos()); update(); }}void Widget::mouseReleaseEvent(QMouseEvent *event){ if( event->button() == Qt::LeftButton ) { m_MouseDown = false; }}void Widget::paintEvent(QPaintEvent *event){ QPixmap temp = m_BasePen->GetPixmap(); QPainter painter(this); painter.drawPixmap(0, 0, temp);}#include "main.moc"int main(int argc, char **argv){ QApplication app(argc, argv); Widget *ww = new Widget; ww->show(); return app.exec();}

 

转载于:https://my.oschina.net/u/185531/blog/1590020

你可能感兴趣的文章
Squid 日志分析 和反向代理
查看>>
Hadoop的安装及一些基本概念解释
查看>>
大容量分区命令parted
查看>>
从输入 URL 到页面加载完成的过程中都发生了什么事情?
查看>>
实例讲解JQuery中this和$(this)区别
查看>>
centos 7 静态ip地址模板
查看>>
影响系统性能的20个瓶颈
查看>>
shell的详细介绍和编程(上)
查看>>
软件开发性能优化经验总结
查看>>
面试题编程题05-python 有一个无序数组,如何获取第K 大的数,说下思路,实现后的时间复杂度?...
查看>>
kendo grid序号显示
查看>>
Spring 教程(二) 体系结构
查看>>
Indexes
查看>>
2.Web中使用iReport 整合----------创建html格式的
查看>>
异常备忘:java.lang.UnsupportedClassVersionError: Bad version number in .class file
查看>>
最全三大框架整合(使用映射)——applicationContext.xml里面的配置
查看>>
初步理解Java的三大特性——封装、继承和多态
查看>>
知识点积累(一)
查看>>
iphone-common-codes-ccteam源代码 CCFile.m
查看>>
python:浅析python 中__name__ = '__main__' 的作用
查看>>