简单的QT绘图程序(把全部的点都记录下来,然后在paintEvent里使用drawLine函数进行绘制,貌似效率很低。。。)
当初在学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
添加如下代码
- #include <QApplication>
- #include <mypainterwidget.h>
- int main(int argc,char** argv)
- {
- QApplication a(argc,argv);
- MyPainterWidget w(0);
- w.show();
- return a.exec();
- }
这里的MyPainterWidget类是我们自己编写的QWidget类的子类,用来实现绘制的窗口部件。
下面我们添加这个类并编写其代码。
3. 添加C++类,命名为MyPainterWidget
.h 文件如下
- #ifndef MYPAINTERWIDGET_H
- #define MYPAINTERWIDGET_H
- #include <QWidget>
- #include <QPoint>
- #include<vector>
- using namespace std;
- //线段
- typedef struct myLine{
- QPoint startPnt;
- QPoint endPnt;
- }myLine;
- class MyPainterWidget: public QWidget
- {
- public:
- MyPainterWidget(QWidget* parent);
- ~MyPainterWidget();
- //继承
- void paintEvent(QPaintEvent* p);
- void mousePressEvent(QMouseEvent *e);
- void mouseMoveEvent(QMouseEvent *e);
- void mouseReleaseEvent(QMouseEvent *e);
- QPoint startPnt; //起点
- QPoint endPnt; //终点
- bool isPressed; //鼠标是否按下
- vector<myLine*> lines; //存放所有的线段
- };
- #endif // MYPAINTERWIDGET_H
.cpp 文件如下
- #include "mypainterwidget.h"
- #include <QString>
- #include <QMessageBox>
- #include <QPainter>
- #include <QPen>
- #include <QMouseEvent>
- MyPainterWidget::MyPainterWidget(QWidget* parent)
- :QWidget(parent){
- setMinimumSize(240,120);
- setMaximumSize(480,240);
- this->setMouseTracking(true);
- this->isPressed = false;
- }
- MyPainterWidget::~MyPainterWidget(){
- }
- void MyPainterWidget::paintEvent(QPaintEvent*p){
- QPainter painter(this);
- QPen pen; //创建一个画笔
- pen.setColor(Qt::darkCyan);
- pen.setWidth(5);
- painter.setPen(pen);
- for(int i = 0;i<lines.size();i++){
- myLine* pLine = lines[i];
- painter.drawLine(pLine->startPnt,pLine->endPnt);
- }
- }
- void MyPainterWidget::mousePressEvent(QMouseEvent *e){
- setCursor(Qt::PointingHandCursor);
- startPnt = e->pos();
- endPnt = e->pos();
- this->isPressed = true;
- //QString msg ="("+QString::number(e->x())+","+QString::number(e->y())+")";
- //QMessageBox::warning(this,tr("Warning"),msg,QMessageBox::Ok);
- }
- void MyPainterWidget::mouseMoveEvent(QMouseEvent *e){
- if(this->isPressed){
- endPnt = e->pos();
- myLine* line = new myLine; //put the new line into vector
- line->startPnt = startPnt;
- line->endPnt = endPnt;
- this->lines.push_back(line);
- update(); //repainter,call paintEvent
- startPnt = endPnt;
- }
- }
- void MyPainterWidget::mouseReleaseEvent(QMouseEvent *e){
- setCursor(Qt::ArrowCursor);
- this->isPressed = false;
- }
3. 运行结果如下
http://blog.csdn.net/jarvischu/article/details/6705127
简单的QT绘图程序(把全部的点都记录下来,然后在paintEvent里使用drawLine函数进行绘制,貌似效率很低。。。)的更多相关文章
- QT应用程序 安装路径中文异常问题
[1]QT 安装中文路径启动异常问题 最近在搞一个很简单的QT应用程序,开发环境VS2017 + QT5.9,线上异常报错:安装中文路径下启动崩溃~~~~ 最后,本地调试Debug版本,发现安装中文路 ...
- 不需要用任何辅助工具打包Qt应用程序
不需要用任何辅助工具打包Qt应用程序.方法如下: 生成release文件后,双击里面的exe文件,会弹出一个对话框,里面提示缺少哪一个DLL文件, 然后根据该文件名到你安装QT软件的目录下的/b ...
- 天底下最简单的QT画图板,就一个类,60行代码
简单直观.但是我有个问题是,这实际上不是在绘制直线,而是几千几万个超级短的“直线”,这样会不会效率很低呢? 注意,每次绘制的时候,需要一支笔,这支笔需要设置颜色和宽度(就像我们平时写字也要稍微挑一下笔 ...
- 第一讲 一个简单的Qt程序分析
本文概要:通过一个简单的Qt程序来介绍Qt程序编写的基本框架与一些Qt程序中常见的概念 #include <QApplication> #include <QPushButton&g ...
- Qt绘图
Qt绘图的设置 QPainter::Antialiasing // 反锯齿 QPainter::TextAntialiasing // 文字反锯齿 QPainter::SmoothPixmapTran ...
- 用html5的canvas和JavaScript创建一个绘图程序
本文将引导你使用canvas和JavaScript创建一个简单的绘图程序. 创建canvas元素 首先准备容器Canvas元素,接下来所有的事情都会在JavaScript里面. <canvas ...
- 报表控件NCReport教程:集成NCReport到Qt应用程序中
NCReport是一款轻量级.快速.多平台.简单易用的基于Qt toolkit的C++编写的报表解决方案,目前主要包括报表渲染库和报表设计器GUI应用程序. 但是好多使用NCReport控件的朋友都不 ...
- 一个简单的DDraw应用程序
阅读排行榜 1. C/C++ 笔试.面试题目大汇总(72915) 2. [STL]list基础(21718) 3. COM笔记-CoCreateInstance(14842) 4. C/C++ ...
- 让你的 Qt 桌面程序看上去更加 native(一共六篇)
<让你的 Qt 桌面程序看上去更加 native>是一个系列文章.在这个系列中,你将会了解到如何让你的 Qt 桌面应用程序看上去更加 native.这里,我假设你已经清楚如何使用 Qt 编 ...
随机推荐
- Altium designer PCB king (收录各种版本)
不要再留念protel99se这么古老的PCB软件了,宝刀也经不起岁月的磨练. 相比Altium Designer,protel99se逊色多了.虽然很多人还是用这把已经快老的刀.作为新时代的新人,我 ...
- Keil C51内存分配与优化
C51的内存分配不同于一般的PC,内存空间有限,采用覆盖和共享技术.在Keil编译器中,经过编译后,会形成一个M51文件,在其内部可以详细的看到内存的分配情况. C51内存常见的两个误区: A.变量超 ...
- Spring集成Hessian
一.概述 Spring 通过org.springframework.remoting.caucho.HessianServiceExporter将POJO中的所有public方法发布为Hessian服 ...
- 2016"百度之星" - 资格赛(Astar Round1) 1001
思路:第一个做法就是:每读入起始位置i和结束位置j,就从这位置i到位置j计算,可是TLE了,后面我想想要是我输入一个最长的字符串,且以最大次数计算开始位置1到结束位置100000,那么这计算量是很大的 ...
- 五分钟读懂UML类图
平时阅读一些远吗分析类文章或是设计应用架构时没少与UML类图打交道.实际上,UML类图中最常用到的元素五分钟就能掌握,下面赶紧来一起认识一下它吧: 一.类的属性的表示方式 在UML类图中,类使用包含类 ...
- 使用Open Flash Chart(OFC)制作图表(Struts2处理)
Java开源项目中制作图表比较出色的就是JFreeChart了,相信大家都听说过,它不仅可以做出非常漂亮的柱状图,饼状图,折线图基本图形之外,还能制作甘特图,仪表盘等图表.在Web应用中可以为项目增色 ...
- java与.net比较学习系列(6) 数组
这一篇文章要总结的内容是数组,数组可以简单地看成是同种数据类型变量的集合,它在我们的开发中经常用到,我们主要从以下几个方面进行总结: 1,数组的创建和初始化 2,数组的访问和遍历 3,数组的总结 数组 ...
- SpringMVC+easyUI CRUD 添加数据C
接一篇文章,今天上午实现了添加数据.以下是Jsp.里面主要是看newUser()和saveUser().注意这函数里的url,newUser()里面去掉url属性.还要注意的一个问题 <div ...
- Qt导出Excel的简单实现
QAxObject对COM对象进行了封装,QAxObject派生自QAxBase,而后者提供了一组API通过IUnknown(不清楚IUnknown的同学可以去看看COM对象模型)指针直接访问COM对 ...
- CSS - 关于li中图文混排不能垂直居中的问题
图片和文字一起放在li标签下不能同时垂直居中 解决办法: 1.设置图片的position:absolute; 2.把文字加上span标签: span{ height:30px;line-heigh ...