当初在学MFC时,最经典的入门实例就是绘图程序,其作用相当于Console Application 下的Hello World了吧。

如今入手QT,不免怀旧,于是也写了一个绘图程序,虽然简单,却也是入门必备啊。

环境

OS : Ubuntu 11.04

IDE :Qt Creator 2.2.1

Qt : 4.7.4 (32bit)

Complier: gcc

1.  新建一个空白Qt工程

文件--> 新建工程或项目-->其它项目-->空的Qt项目

比如命名为Qt_Instance_Example

2. 添加一个C++源文件

比如命名为main.cpp

添加如下代码

  1. #include <QApplication>
  2. #include <mypainterwidget.h>
  3. int main(int argc,char** argv)
  4. {
  5. QApplication a(argc,argv);
  6. MyPainterWidget w(0);
  7. w.show();
  8. return a.exec();
  9. }

这里的MyPainterWidget类是我们自己编写的QWidget类的子类,用来实现绘制的窗口部件。

下面我们添加这个类并编写其代码。

3.  添加C++类,命名为MyPainterWidget

.h 文件如下

  1. #ifndef MYPAINTERWIDGET_H
  2. #define MYPAINTERWIDGET_H
  3. #include <QWidget>
  4. #include <QPoint>
  5. #include<vector>
  6. using namespace std;
  7. //线段
  8. typedef struct myLine{
  9. QPoint startPnt;
  10. QPoint endPnt;
  11. }myLine;
  12. class MyPainterWidget: public QWidget
  13. {
  14. public:
  15. MyPainterWidget(QWidget* parent);
  16. ~MyPainterWidget();
  17. //继承
  18. void paintEvent(QPaintEvent* p);
  19. void mousePressEvent(QMouseEvent *e);
  20. void mouseMoveEvent(QMouseEvent *e);
  21. void mouseReleaseEvent(QMouseEvent *e);
  22. QPoint startPnt;   //起点
  23. QPoint endPnt;     //终点
  24. bool isPressed;    //鼠标是否按下
  25. vector<myLine*> lines; //存放所有的线段
  26. };
  27. #endif // MYPAINTERWIDGET_H

.cpp 文件如下

  1. #include "mypainterwidget.h"
  2. #include <QString>
  3. #include <QMessageBox>
  4. #include <QPainter>
  5. #include <QPen>
  6. #include <QMouseEvent>
  7. MyPainterWidget::MyPainterWidget(QWidget* parent)
  8. :QWidget(parent){
  9. setMinimumSize(240,120);
  10. setMaximumSize(480,240);
  11. this->setMouseTracking(true);
  12. this->isPressed = false;
  13. }
  14. MyPainterWidget::~MyPainterWidget(){
  15. }
  16. void MyPainterWidget::paintEvent(QPaintEvent*p){
  17. QPainter painter(this);
  18. QPen pen;                                 //创建一个画笔
  19. pen.setColor(Qt::darkCyan);
  20. pen.setWidth(5);
  21. painter.setPen(pen);
  22. for(int i = 0;i<lines.size();i++){
  23. myLine* pLine = lines[i];
  24. painter.drawLine(pLine->startPnt,pLine->endPnt);
  25. }
  26. }
  27. void MyPainterWidget::mousePressEvent(QMouseEvent *e){
  28. setCursor(Qt::PointingHandCursor);
  29. startPnt = e->pos();
  30. endPnt = e->pos();
  31. this->isPressed = true;
  32. //QString msg ="("+QString::number(e->x())+","+QString::number(e->y())+")";
  33. //QMessageBox::warning(this,tr("Warning"),msg,QMessageBox::Ok);
  34. }
  35. void MyPainterWidget::mouseMoveEvent(QMouseEvent *e){
  36. if(this->isPressed){
  37. endPnt = e->pos();
  38. myLine* line = new myLine;  //put the new line into vector
  39. line->startPnt = startPnt;
  40. line->endPnt = endPnt;
  41. this->lines.push_back(line);
  42. update();                                    //repainter,call paintEvent
  43. startPnt = endPnt;
  44. }
  45. }
  46. void MyPainterWidget::mouseReleaseEvent(QMouseEvent *e){
  47. setCursor(Qt::ArrowCursor);
  48. this->isPressed = false;
  49. }

3. 运行结果如下

http://blog.csdn.net/jarvischu/article/details/6705127

简单的QT绘图程序(把全部的点都记录下来,然后在paintEvent里使用drawLine函数进行绘制,貌似效率很低。。。)的更多相关文章

  1. QT应用程序 安装路径中文异常问题

    [1]QT 安装中文路径启动异常问题 最近在搞一个很简单的QT应用程序,开发环境VS2017 + QT5.9,线上异常报错:安装中文路径下启动崩溃~~~~ 最后,本地调试Debug版本,发现安装中文路 ...

  2. 不需要用任何辅助工具打包Qt应用程序

    不需要用任何辅助工具打包Qt应用程序.方法如下:    生成release文件后,双击里面的exe文件,会弹出一个对话框,里面提示缺少哪一个DLL文件, 然后根据该文件名到你安装QT软件的目录下的/b ...

  3. 天底下最简单的QT画图板,就一个类,60行代码

    简单直观.但是我有个问题是,这实际上不是在绘制直线,而是几千几万个超级短的“直线”,这样会不会效率很低呢? 注意,每次绘制的时候,需要一支笔,这支笔需要设置颜色和宽度(就像我们平时写字也要稍微挑一下笔 ...

  4. 第一讲 一个简单的Qt程序分析

    本文概要:通过一个简单的Qt程序来介绍Qt程序编写的基本框架与一些Qt程序中常见的概念 #include <QApplication> #include <QPushButton&g ...

  5. Qt绘图

    Qt绘图的设置 QPainter::Antialiasing // 反锯齿 QPainter::TextAntialiasing // 文字反锯齿 QPainter::SmoothPixmapTran ...

  6. 用html5的canvas和JavaScript创建一个绘图程序

    本文将引导你使用canvas和JavaScript创建一个简单的绘图程序. 创建canvas元素 首先准备容器Canvas元素,接下来所有的事情都会在JavaScript里面. <canvas ...

  7. 报表控件NCReport教程:集成NCReport到Qt应用程序中

    NCReport是一款轻量级.快速.多平台.简单易用的基于Qt toolkit的C++编写的报表解决方案,目前主要包括报表渲染库和报表设计器GUI应用程序. 但是好多使用NCReport控件的朋友都不 ...

  8. 一个简单的DDraw应用程序

        阅读排行榜 1. C/C++ 笔试.面试题目大汇总(72915) 2. [STL]list基础(21718) 3. COM笔记-CoCreateInstance(14842) 4. C/C++ ...

  9. 让你的 Qt 桌面程序看上去更加 native(一共六篇)

    <让你的 Qt 桌面程序看上去更加 native>是一个系列文章.在这个系列中,你将会了解到如何让你的 Qt 桌面应用程序看上去更加 native.这里,我假设你已经清楚如何使用 Qt 编 ...

随机推荐

  1. 2B相对来说,早期它的成长速度不会像2C那么快

    叶冠泰:今天我们是在场比较少数的2B的公司,你能不能给创业者一些分享,你觉得2B跟2C的差别是什么,我们要怎样发展? 蒋韬:这可能跟性格有关系,我的性格可能更适合去做2B的业务. 对于做2B业务的创业 ...

  2. 2013第46周四xml作为WS两端中间测试文件

    今天又到了11点多才开始写随笔记录,有点惭愧,加班回来到现在已经近2小时了,而我此刻才进入正题,之前的时间都跟MM聊天了,或许是单身久了,居然在个人情感方面感觉自己很out了,不想这些了,重点是回顾下 ...

  3. 使用 Strace 和 GDB 调试工具的乐趣

    编写 UNIX® 系统程序充满乐趣,并且具有教育意义.使用 UNIX strace 工具和 GDB(GNU 项目调试工具),您可以真正地深入研究系统的功能,并了解组成这些功能的各种各样的程序.同时使用 ...

  4. JQuery 选择器 *很重要 多记

    1)基本选择器: 跟CSS选择器类似 2) 层次选择器 div>span   紧接这div同一级下的全部span .one+div     同一等级的div #two~div    同一等级di ...

  5. 再一次强调,ORACLE外键必须加索引

    外键加索引是常识,必须牢记.本来不想写这样的简单案例.可是连续遇到好几起外键不加索引导致性能问题,所以还是写一下. 一个兄弟问我 delete from Sa_Sales_Comm_Detail s  ...

  6. [Immutable.js] Exploring Sequences and Range() in Immutable.js

    Understanding Immutable.js's Map() and List() structures will likely take you as far as you want to ...

  7. 大到可以小说的Y组合子(二)

    问:上一回,你在最后曾提到"抽象性不足",这话怎么说? 答:试想,如果现在需要实现一个其它的递归(比如:Fibonacci),就必须把之前的模式从头套一遍,然后通过fib_make ...

  8. Android adb不是内部或外部命令 (转)

    dos窗口运行adb命令出现错误:adb不是内部或外部命令…. 出现问题原因及解决办法: 1.没有配置相关环境变量. 只要将android 的sdk安装路径添加到系统变量Path中即可. (以win7 ...

  9. SQL Server 存储过程之基础知识(转)

    什么是存储过程呢?存储过程就是作为可执行对象存放在数据库中的一个或多个SQL命令. 通俗来讲:存储过程其实就是能完成一定操作的一组SQL语句. 那为什么要用存储过程呢?1.存储过程只在创造时进行编译, ...

  10. elasticsearch,http://ip:9200访问不到的解决办法

    现在解压elasticsearch之后,启动,通过http://localhost:9200可以访问的到,但是http://ip:9200访问不到,怎么办呢?带你解决,带你飞 修改elasticsea ...