简单图形编程的学习(2)---点 (Qt实现)
write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie
讨论新闻组及文件
一、 画点
在Qt中画点的函数是QPainter的drawPoint函数,还是放在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功能弱的吐血,Eclipse的vi模拟就够差的了,QtCreator虽然原生就带,但是几乎还不如不用,还是VS中的ViEmu强大),程序的其他效果及截图也请参考此系列相关其他文章了:
《简单图形编程的学习(2)---点 (Windows GDI实现)》
《简单图形编程的学习(2)---点 (small basic实现)》
write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie
分享到:
相关推荐
(2)适用于想了解学习QT的学生,编程小白等 (3)QT是跨平台C++图形用户界面应用程序开发框架 (4)QT具有跨平台、面向对象、丰富的API、帮助文档丰富的特点, 1.跨平台。我们编写的一套程序,若没有极其特殊的要求...
Qt应用程序的主窗口是由多个部件/组件构成的框架,本章通过一个简单文本编辑器的例子,介绍了主窗口的菜单、工具条、中心部件、锚接部件和状态条,并通过Qt设计器绘制和手写代码两种方法实现了简单文本编辑器主窗口...
十一、Qt 2D绘图(一)绘制简单图形 十二、Qt 2D绘图(二)渐变填充 十三、Qt 2D绘图(三)绘制文字 十四、Qt 2D绘图(四)绘制路径 十五、Qt 2D绘图(五)显示图片 十六、Qt 2D绘图(六)坐标系统 十七、Qt 2D绘图...
Qt应用程序的主窗口是由多个部件/组件构成的框架,本章通过一个简单文本编辑器的例子,介绍了主窗口的菜单、工具条、中心部件、锚接部件和状态条,并通过Qt设计器绘制和手写代码两种方法实现了简单文本编辑器主窗口...
2.运行Qt Creator,首先弹出的是欢迎界面,这里可以打开其自带的各种演示 程序。 3.我们用File->New 菜单来新建工程。 4.这里我们选择Qt4 Gui Application。 5.下面输入工程名和要保存到的文件夹路径。我们这里的...
1. 本书专注介绍Qt C++编程。Qt 的C++类库是Qt的核心,适合于开发跨平台的桌面应用程序,例如在专业应用软件开发方面一般使用Qt C++...本书适合于具有C++语言基础,想要学习Qt C++,并准备用Qt C++编写应用软件的读者。
对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】: 有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 鼓励下载和使用,并欢迎大家互相学习,共同...
Signal & Slot机制是Qt中实现对象间事件驱动通信的核心方式。信号代表对象状态变化或事件发生,槽则是响应这些信号的可调用实体。这种松耦合的通信方式简化了异步编程和事件处理。 QML与Qt Quick: QML是一种...
Signal & Slot机制是Qt中实现对象间事件驱动通信的核心方式。信号代表对象状态变化或事件发生,槽则是响应这些信号的可调用实体。这种松耦合的通信方式简化了异步编程和事件处理。 QML与Qt Quick: QML是一种...
用c++/qt写的项目,可供自己学习,项目都经测试过,真实可靠,请放心使用。Qt支持 Windows、Linux/Unix、Mac OS X、Android、BlackBerry、QNX等多种平台,并为这些不同的平台提供了统一的开发环境。 面向对象 C++...
自顶向下分析是常用的分析方法,本次题目其实较为简单,常用的链表结构我们在学习数据结构课程时已经非常熟练,此次实现图形化界面的演示需要结合原有结构,融入图形化元素和用户界面接口,对程序的功能分析,显然...
对于想要学习如何使用 PyQt5 绘制简单图形、处理用户交互以及了解自定义小部件的创建和使用的初学者来说,这是一个很好的入门资源。熟悉其他编程语言,并希望快速学习使用 PyQt5 来构建界面的开发者也可以受益于这个...
HighGui:提供图形用户界面(GUI)支持,如图像和视频的显示、用户交互(如鼠标事件处理)以及简单的窗口管理。 VideoIO:负责视频的读写操作,支持多种视频格式和捕获设备。 Objdetect:包含预训练的对象检测...
第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/...
HighGui:提供图形用户界面(GUI)支持,如图像和视频的显示、用户交互(如鼠标事件处理)以及简单的窗口管理。 VideoIO:负责视频的读写操作,支持多种视频格式和捕获设备。 Objdetect:包含预训练的对象检测...
ZKQ090206 C++QT图形编程 Qt开发环境安装与配置;C++面向对象基础;Qt内置组件应用与自定义组件开发;Qt信号与槽机制;Qt模型应用(树、表、栈);Qt多线程与网络;Qt图形开发;Qt内置数据仓库技术(mysql、sqlite);Qt...
第一阶段在PC机上学习熟悉Linux. 一.Red Hat Linux 9下的常用操作… ………………… 二.Minicom的使用….… 三.NFS的使用… … 四.应用程序编程实验…… 五.模块编程实验…… 六.简单的字符设备驱动实验…… 第二...
HighGui:提供图形用户界面(GUI)支持,如图像和视频的显示、用户交互(如鼠标事件处理)以及简单的窗口管理。 VideoIO:负责视频的读写操作,支持多种视频格式和捕获设备。 Objdetect:包含预训练的对象检测...
第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 ...