`
icheng
  • 浏览: 821180 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
文章分类
社区版块
存档分类
最新评论

简单图形编程的学习(2)---点 (Qt实现)

 
阅读更多

简单图形编程的学习(2--- (Qt实现)

write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie

讨论新闻组及文件

一、 画点

Qt中画点的函数是QPainterdrawPoint函数,还是放在QPainter体现了Qt决心将所有的绘图指令放在一个对象中。(除了OpenGL)既然如此,使用方法上和drawText也就差不太多了。

开篇来个最简单的示例吧,画点世界的HelloWorld,随机的点。

这个工程的全部文件都贴出来,也作为Qt中实现动画的一种示例:

Main.cpp:

#include <QtGui/QApplication>

#include <QTest>

#include <QTime>

#include "pointwidget.h"

int main(int argc, char *argv[])

{

QApplication a(argc, argv);

PointWidget w;

w.show();

QTime timer;

// 这是能随机绘点的关键,没有设置此属性,默认相当于每次Qt都会完整的将上一次的屏幕擦除,

// 新版的Qt中已经没有了repaint(bool)接口了。

w.setAttribute(Qt::WA_OpaquePaintEvent);

while(true)

{

timer.start();

// 调用此函数即相当于Windows中的GetMessage,系列函数,包括了tranlate,分发函数等的所有操作

a.processEvents();

w.repaint();

// 此处是控制帧数的关键点

while(timer.elapsed() < 33)

{

QTest::qSleep(1);

}

}

}

Pointwidget.h

#ifndef POINTWIDGET_H

#define POINTWIDGET_H

#include <QtGui/QWidget>

#include <QPainter>

#include <QObject>

namespace Ui

{

class PointWidget;

}

class PointWidget : public QWidget

{

Q_OBJECT

public:

PointWidget(QWidget *parent = 0);

~PointWidget();

protected:

void paintEvent(QPaintEvent *event);

//void keyPressEvent(QKeyEvent *event);

//void closeEvent(QCloseEvent *event);

private:

Ui::PointWidget *ui;

};

#endif // POINTWIDGET_H

Pointwidget.cpp

#include "pointwidget.h"

#include "ui_pointwidget.h"

PointWidget::PointWidget(QWidget *parent)

: QWidget(parent), ui(new Ui::PointWidget)

{

ui->setupUi(this);

qsrand(time(NULL));

}

PointWidget::~PointWidget()

{

delete ui;

}

void PointWidget::paintEvent(QPaintEvent *event)

{

QPainter painter(this);

for(int i = 0; i < 1000; ++i)

{

int r = qrand() % 255;

int g = qrand() % 255;

int b = qrand() % 255;

QPen pen(qRgb(r,g,b));

painter.setPen(pen);

int x = qrand() % 800;

int y = qrand() % 800;

// 其实核心内容就是调用这一个函数而已

painter.drawPoint(x,y);

}

}

同样还是比较简单,当然,得首先熟悉Qt的基本机制,其中控制循环的方式特别重要,虽然这里可以使用与Win32 Timer类似的定时器技术来实现这样简单的绘制,但是对于帧数的稳定控制还是这样的代码比较可靠,另外,w.setAttribute(Qt::WA_OpaquePaintEvent);一句够初学者找够久的了。。。(我就找了很久)

知道这些以后,剩下的也就是一个qrand函数+ drawPoint函数的理解量了。这里不放截图了,这么简单的东西放个截图我都觉得没有意思。

1. 老电视机雪花点的效果:

Main.cpp中用

PointWidget w;

QPalette palette;

palette.setColor(QPalette::Window, QColor(0,0,0));

w.setPalette(palette);

几行代码改变Widget的背景,这里说明一下,其实这样改变背景个人感觉属于Qt中面向对象过头的一个问题,事实上远远复杂于一个简单的SetBkColor函数,但是Qt将所有与界面颜色相关的东西封在QPalette中,以后同时改变多个属性的时候会稍微简单一点(其实也没有简单到哪去,多次调用SetTextColor,SetBkColor等语句也不见的复杂到哪去)

老电视机雪花效果中每次都需要擦除重绘避免点的叠加所以一下语句注释掉

// w.setAttribute(Qt::WA_OpaquePaintEvent);

paintEvent实现:

void PointWidget::paintEvent(QPaintEvent *event)

{

QPainter painter(this);

for(int i = 0; i < 1000; ++i)

{

// 老电视机都是白色雪花点

QPen pen(qRgb(255,255,255));

painter.setPen(pen);

int x = qrand() % 800;

int y = qrand() % 800;

painter.drawPoint(x,y);

}

}

完整代码就不贴了。

2. 移动的星空:

主要实现代码:

PointWidget::PointWidget(QWidget *parent)

: QWidget(parent), ui(new Ui::PointWidget)

{

ui->setupUi(this);

qsrand(time(NULL));

// 初始化星空中的点

for(int i = 0; i < POINT_NUMBER; ++i)

{

marPoint[i].rx() = qrand() % 800;

marPoint[i].ry() = qrand() % 800;

}

}

PointWidget::~PointWidget()

{

delete ui;

}

void PointWidget::paintEvent(QPaintEvent *event)

{

QPainter painter(this);

QPen pen(qRgb(255,255,255));

painter.setPen(pen);

for(int i = 0; i < POINT_NUMBER; ++i)

{

marPoint[i].rx()++;

if(marPoint[i].x() > 800)

{

marPoint[i].rx() = 0;

}

painter.drawPoint(marPoint[i]);

}

}

思路还是与以前的一样,无非是西安初始化一些点,然后改变其x坐标,但是要说明的是,Qt为我们简化了很多操作,首先,默认情况下,会擦出每一帧,这样就不用我们手动通过覆盖上一个点的方式去完成,另外,默认使用了双缓冲方式显示图片(与上个特性其实是统一的。。。。)完全不闪。。。。

二、 小结

一个个简单的点就能够构成的效果比本文展示的要多的多,参考以前的文章,因为笔者对Qt的熟悉程度有限,重新实现程序费时费力,并且也不太适应目前所用的QtCreator工具(主要是vi功能弱的吐血,Eclipsevi模拟就够差的了,QtCreator虽然原生就带,但是几乎还不如不用,还是VS中的ViEmu强大),程序的其他效果及截图也请参考此系列相关其他文章了:

简单图形编程的学习(2--- (Windows GDI实现)

简单图形编程的学习(2--- (small basic实现)

write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie

分享到:
评论

相关推荐

    基于QT软件实现简易计算器

    (2)适用于想了解学习QT的学生,编程小白等 (3)QT是跨平台C++图形用户界面应用程序开发框架 (4)QT具有跨平台、面向对象、丰富的API、帮助文档丰富的特点, 1.跨平台。我们编写的一套程序,若没有极其特殊的要求...

    精通qt4编程(源代码)

    Qt应用程序的主窗口是由多个部件/组件构成的框架,本章通过一个简单文本编辑器的例子,介绍了主窗口的菜单、工具条、中心部件、锚接部件和状态条,并通过Qt设计器绘制和手写代码两种方法实现了简单文本编辑器主窗口...

    QT经典教程_详细一步一步例子

    十一、Qt 2D绘图(一)绘制简单图形 十二、Qt 2D绘图(二)渐变填充 十三、Qt 2D绘图(三)绘制文字 十四、Qt 2D绘图(四)绘制路径 十五、Qt 2D绘图(五)显示图片 十六、Qt 2D绘图(六)坐标系统 十七、Qt 2D绘图...

    精通Qt4编程(第二版)源代码

    Qt应用程序的主窗口是由多个部件/组件构成的框架,本章通过一个简单文本编辑器的例子,介绍了主窗口的菜单、工具条、中心部件、锚接部件和状态条,并通过Qt设计器绘制和手写代码两种方法实现了简单文本编辑器主窗口...

    Qt5.9 c++开发指南.zip

    1. 本书专注介绍Qt C++编程。Qt 的C++类库是Qt的核心,适合于开发跨平台的桌面应用程序,例如在专业应用软件开发方面一般使用Qt C++...本书适合于具有C++语言基础,想要学习Qt C++,并准备用Qt C++编写应用软件的读者。

    Qt Creator 的安装和hello world 程序+其他程序的编写--不是一般的好

    2.运行Qt Creator,首先弹出的是欢迎界面,这里可以打开其自带的各种演示 程序。 3.我们用File-&gt;New 菜单来新建工程。 4.这里我们选择Qt4 Gui Application。 5.下面输入工程名和要保存到的文件夹路径。我们这里的...

    毕设&课设&项目&实训-致力于用最简单高效的工程化方式学习编程,采用Flowgorithm流程图交互式图形软件实现.zip

    对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】: 有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 鼓励下载和使用,并欢迎大家互相学习,共同...

    毕设:仿QQ界面的聊天系统,客户端使用qt进行界面设计,服务端为linux,利用sockets编程.zip

    用c++/qt写的项目,可供自己学习,项目都经测试过,真实可靠,请放心使用。Qt支持 Windows、Linux/Unix、Mac OS X、Android、BlackBerry、QNX等多种平台,并为这些不同的平台提供了统一的开发环境。 面向对象 C++...

    基于C++的链表实现过程化.zip

    自顶向下分析是常用的分析方法,本次题目其实较为简单,常用的链表结构我们在学习数据结构课程时已经非常熟练,此次实现图形化界面的演示需要结合原有结构,融入图形化元素和用户界面接口,对程序的功能分析,显然...

    PyQt5 编写的指示灯类

    对于想要学习如何使用 PyQt5 绘制简单图形、处理用户交互以及了解自定义小部件的创建和使用的初学者来说,这是一个很好的入门资源。熟悉其他编程语言,并希望快速学习使用 PyQt5 来构建界面的开发者也可以受益于这个...

    嵌入式Linux应用程序开发标准教程(第2版全)

    第12章 Qt图形编程基础 12.1 嵌入式GUI简介 12.1.1 Qt/Embedded 12.1.2 MiniGUI 12.1.3 Microwindows、TinyX等 12.2 Qt/Embedded开发入门 12.2.1 Qt/Embedded介绍 12.2.2 Qt/Embedded信号和插槽机制 12.2.3 搭建Qt/...

    嵌入式\(高校应用案例)北航软件学院

    ZKQ090206 C++QT图形编程 Qt开发环境安装与配置;C++面向对象基础;Qt内置组件应用与自定义组件开发;Qt信号与槽机制;Qt模型应用(树、表、栈);Qt多线程与网络;Qt图形开发;Qt内置数据仓库技术(mysql、sqlite);Qt...

    嵌入式Linux入门笔记(十年程序员精品推荐、让你看得懂的笔记、结合开发板例程精心讲解)

    第一阶段在PC机上学习熟悉Linux. 一.Red Hat Linux 9下的常用操作… ………………… 二.Minicom的使用….… 三.NFS的使用… … 四.应用程序编程实验…… 五.模块编程实验…… 六.简单的字符设备驱动实验…… 第二...

    嵌入式Linux应用程序开发详解

    第12章 Qt图形编程 400 12.1 嵌入式GUI简介 400 12.1.1 Qt/Embedded 401 12.1.2 MiniGUI 401 12.1.3 Microwindows、Tiny X等 402 12.2 Qt/Embedded开发入门 402 12.2.1 Qt/Embedded介绍 402 ...

    WZQWL五子棋小游戏毕业设计或课题代码和参考学习研究文档

    游戏界面采用了图形化界面,使用了QT框架进行开发。游戏界面主要包括五子棋棋盘、游戏菜单、游戏状态栏等。 游戏逻辑 游戏逻辑主要包括棋盘的绘制、棋子的下落、胜负的判断等。游戏采用了面向对象的编程思想,将...

    C++开源程序库 C++开源程序库

    传统上Qt被认为是可移植的GUI库,但实际上Qt现在已经是一个比较完整的可移植应用程序框架了,其中包含了大量的工具,比如正则表达式、Web和 Socket类、2D和3D图形、XML解析、SQL类等,甚至还包括了一个完整的容器...

    无线蓝牙点菜系统(代码文档齐全)

    2. 采用QT图形系统实现订菜情况的显示,查询功能 3. 接收到实验箱端的信息后,能进行解析,获取菜名,座位号,订菜时间,价格等重要信息,并传递给应用层。 4. 要考虑先进先出,菜的排队系统,让先点的人能尽量先...

    Matlab代码verilog-dedsec-xu.github.io:dedsec-xu.github.io

    Matlab代码verilog 自我介绍 我来自华中科技大学。 我正在电子信息和通信学院的精英工程师班学习。...一个简单的MATLAB音乐播放器,具有多种功能:钢琴模式,均衡器,频谱,波形可视化器。 我使用MATLAB开发的。 W

    Matlab代码verilog-self-introduction:自我介绍

    现场可编程门阵列 主控板 模拟电路 数字电路 我的专案 ICDAR-2015数据集标签 LabelImg是图形图像注释工具。 使用Qt C ++和Python开发。 用户只需拖动即可使用此gui软件制作ICDAR 2015格式的数据集。 它还实现了一个...

Global site tag (gtag.js) - Google Analytics