Qt 2D painting Demo 的翻译
目录名字
- Qt 2D painting Demo 的翻译
- Helper Class 定义
- Helper Class 的实现
- Widget Class 定义
- Widget Class 实现
- GLWidget Class 定义
- GLWidget Class 实现
- Window Class 定义
- Window Class 实现
Qt 2D painting Demo 的翻译
2D Painting 示例简介:
该示例描述了怎样使用QPainter 和QGLWidget 来显示2D图像。
QPainter类是实现2D图形的绘制。
QGLWidget类可以实现图形的加速,如果硬件支持的话。
该示例分别用两种方式来实现绘制,一个是在QWiget抗锯齿的方式绘制,另一个是在QGLWidget上抗锯齿的方式绘制。
为了能够比较这两种方式绘图的结果,我们单独创建一个Help 类供使用。
Helper Class 定义
在示例中,绘图部分的功能是通过Help类来实现,该类非常简短。
class Helper{public:Helper();public:void paint(QPainter *painter, QPaintEvent *event, int elapsed);private:QBrush background;QBrush circleBrush;QFont textFont;QPen circlePen;QPen textPen;};
除了构造函数,这里只有一个paint()函数共widget的子类调用。
Helper Class 的实现
该类的构造函数,初始化了绘图所需要的一些参数资源。
Helper::Helper(){QLinearGradient gradient(QPointF(50, -20), QPointF(80, 20));gradient.setColorAt(0.0, Qt::white);gradient.setColorAt(1.0, QColor(0xa6, 0xce, 0x39));background = QBrush(QColor(64, 32, 64));circleBrush = QBrush(gradient);circlePen = QPen(Qt::black);circlePen.setWidth(1);textPen = QPen(Qt::white);textFont.setPixelSize(50);}
绘图的操作是通过paint()函数。通常的做法是:
1、创建QPainter 的一个对象,将图绘制到QWidget或者QGLWidget 上;
2、QPaintEvent提供了一个可供绘制的区域。,一个elapsed time用来描述了界面刷新的时间间隔。
void Helper::paint(QPainter *painter, QPaintEvent *event, int elapsed){painter->fillRect(event->rect(), background);
painter->translate(100, 100);
我们一开始填充了一个背景,然后平移坐标系到绘图设备的中心(这里图的大小是200x200)进行下面的绘制。
我们绘制一个螺旋形的一些圆。通过参数elapset time 来绘制从坐标原点向外逐渐外移的圆。
painter->save();
painter->setBrush(circleBrush);
painter->setPen(circlePen);
painter->rotate(elapsed * 0.030);
qreal r = elapsed / 1000.0;
int n = 30;
for (int i = 0; i < n; ++i) {
painter->rotate(30);
qreal factor = (i + r) / n;
qreal radius = 0 + 120.0 * factor;
qreal circleRadius = 1 + factor * 20;
painter->drawEllipse(QRectF(radius, -circleRadius,
circleRadius * 2, circleRadius * 2));
}
painter->restore();
由于这里坐标系统经过多次旋转变换,这里我们用到save() 和restore() 的方法 来回到变换之前的坐标系。
painter->setPen(textPen);painter->setFont(textFont);painter->drawText(QRect(-50, -50, 100, 100), Qt::AlignCenter, QStringLiteral("Qt"));}
最后我们在坐标系的中心绘制文字“Qt”。
Widget Class 定义
该类个性化了窗体的显示,通过调用Help类的绘制来实现动画的功能。
class Helper;
class Widget : public QWidget{Q_OBJECTpublic:Widget(Helper *helper, QWidget *parent);public slots:void animate();protected:void paintEvent(QPaintEvent *event) override;private:Helper *helper;int elapsed;};
可以看到,除了构造函数外,这里包含了:
一个paintEvent() 函数,该函数使我们能后自定义图形的绘制。
一个槽函数animate() 来实现动画。
一个成员指针变量,指向Help类的成员对象。
一个记录刷新时间的变量
Widget Class 实现
构造函数:
1、建立并保存一个helper对象;
2、将刷新时间设为0;
3、将窗体大小设为200x200
Widget::Widget(Helper *helper, QWidget *parent): QWidget(parent), helper(helper){elapsed = 0;setFixedSize(200, 200);}
The animate() 槽函数实现了定时刷新界面的功能
void Widget::animate(){elapsed = (elapsed + qobject_cast<QTimer*>(sender())->interval()) % 1000;update();}
这里我们,这里我们决定了一个elapsed时间变化的快慢的处理方法。
通过paintEvent 事件来绘图。
void Widget::paintEvent(QPaintEvent *event){QPainter painter;painter.begin(this);painter.setRenderHint(QPainter::Antialiasing);helper->paint(&painter, event, elapsed);painter.end();}
GLWidget Class 定义
GLWIDget类与widget类定义类似,唯一不同点是它继承自QOpenGLWidget.
class Helper;
class GLWidget : public QOpenGLWidget{Q_OBJECTpublic:GLWidget(Helper *helper, QWidget *parent);public slots:void animate();protected:void paintEvent(QPaintEvent *event) override;private:Helper *helper;int elapsed;};
GLWidget Class 实现
构造函数:
GLWidget::GLWidget(Helper *helper, QWidget *parent): QOpenGLWidget(parent), helper(helper){elapsed = 0;setFixedSize(200, 200);setAutoFillBackground(false);}
animate() 槽函数与 Widget 类中雷同:
void GLWidget::animate(){elapsed = (elapsed + qobject_cast<QTimer*>(sender())->interval()) % 1000;update();}
paintEvent() 与与 Widget 类中雷同:
void GLWidget::paintEvent(QPaintEvent *event){QPainter painter;painter.begin(this);painter.setRenderHint(QPainter::Antialiasing);helper->paint(&painter, event, elapsed);painter.end();}
Window Class 定义
The Window class has a basic, minimal definition:
class Window : public QWidget{Q_OBJECTpublic:Window();private:Helper helper;};
Window Class 实现
构造函数做了所有的工作,创建窗体和控件、创建一个定时器,
没过50ms 会 update(),从而回调paintEvent函数,从而实现20帧每秒的刷新率
Window::Window(){setWindowTitle(tr("2D Painting on Native and OpenGL Widgets"));Widget *native = new Widget(&helper, this);GLWidget *openGL = new GLWidget(&helper, this);QLabel *nativeLabel = new QLabel(tr("Native"));nativeLabel->setAlignment(Qt::AlignHCenter);QLabel *openGLLabel = new QLabel(tr("OpenGL"));openGLLabel->setAlignment(Qt::AlignHCenter);QGridLayout *layout = new QGridLayout;layout->addWidget(native, 0, 0);layout->addWidget(openGL, 0, 1);layout->addWidget(nativeLabel, 1, 0);layout->addWidget(openGLLabel, 1, 1);setLayout(layout);QTimer *timer = new QTimer(this);connect(timer, &QTimer::timeout, native, &Widget::animate);connect(timer, &QTimer::timeout, openGL, &GLWidget::animate);timer->start(50);}
本篇翻译完毕,本人翻译纯粹是项目应用和学习的需要,如有不妥,恳请朵朵指正。
Qt 2D painting Demo 的翻译相关推荐
- Qt文档阅读笔记-官方2D Painting Example实例解析
目录 2D Painting Example Overview Helper Class Definition Helper Class Implementation Widget Class Def ...
- Qt 2D绘图之二:抗锯齿渲染和坐标系统
一.抗锯齿渲染 1.1 逻辑绘图 图形基元的大小(宽度和高度)始终与其数学模型相对应,下图示意了忽略其渲染时使用的画笔的宽度的样子. 1.2 物理绘图(默认情况) 在默认的情况下,绘制会产生锯齿,并且 ...
- Qt 2D绘图功能简单总结
文章目录 Qt 2D绘图功能简单总结 Qt 2D绘图功能简单总结 Qt 的绘图功能非常强大,它可以绘制一切想要的图形,从最简单的一条直线到其他任何复杂的图形,还可以用来绘制文本和图片. Qt的绘图系统 ...
- Qt 系统下的qm翻译文件
一.使用背景 如果,当你使用QMessageBox.QFileDialog等系统提供的方法时,可能打开的界面中有个控件提示信息未汉化. 其实,qt是提供的qm翻译文件的,所以我们可以使用它来进行翻译了 ...
- qt中制作添加 .ts 翻译文件
qt中制作添加 .ts 翻译文件 QT 中可以用其自身的工具对界面语言进行翻译,以实现支持语言的效果,这对于开发用户跨越语言区域的工具来说是一个特别实用的功能. 下面介绍怎么制作和使用qt的翻译文件: ...
- Google Cartographer 《Real-Time Loop Closure in 2D LIDAR SLAM》翻译 (中英对照)
Google Cartographer <Real-Time Loop Closure in 2D LIDAR SLAM>翻译 (中英对照) 作者: Wolfgang Hess, Damo ...
- Qt 2D绘图(5):绘制图像基础
Qt 2D绘图(5):绘制图像基础 本文为原创文章,转载请注明出处,或注明转载自"黄邦勇帅(原名:黄勇) 本文出自本人原创著作<Qt5.10 GUI完全参考手册>网盘地址: ht ...
- 在VS中实现QT的多国语言翻译
QT的多国语法翻译非常的实用,可以将开发完成的软件,直接翻译成另外一种语言,而不需要更改代码,也就是说一次开发可以同时发布多个语言版本的软件. 翻译过程 创建翻译文件:从代码中自动提取出能翻译的文本, ...
- Qt 信号量 QSemaphore Class 的翻译
关于 Qt QSemaphore class 的翻译 Qt 的 QSemaphore class 提供了一个通用的信号量(可以是单一的,也可以是数量多个的)的使用方法. 需要编辑环境添加: Heade ...
最新文章
- 64位十六进制转浮点数
- CentOS-7.2部署OpenLDAP服务器以及客户端
- 除了《深入理解 Java 虚拟机》,还可以看怎么系统学习 Java 虚拟机?
- python3多线程第三方库_Python之多线程爬虫抓取网页图片的示例代码
- 【正一专栏】新赛季欧冠小组赛猜想
- 【CTR模型】TensorFlow2.0 的 DeepFM 实现与实战(附代码+数据)
- 网易云课堂解析_使用SQL分析网易云课堂职场提升类课程
- 点击空链接,页面不跳到页头
- mysql mvcc undo_Mysql Innodb中undo-log和MVCC多版本一致性读 的实现
- TurboMail助某水利委员会邮件通讯更新换血
- 记事本编程开发以及IDEA编程开发
- 程 | 深度学习 + OpenCV,Python 实现实时视频目标检测 机器之心 09-21
- 申请计算机助理的英语作文,各位帮我找一篇英文申请信大学英语作文,申请助理..._口译笔译考试_帮考网...
- VisualStudio各版本的安装与使用(持续更新)
- 列表套字典三者匹配对应关系
- 猜一猜,我国第一次大规模应用二维码是什么时候?
- 计算机相关经典书籍推荐
- 哪个软件可以制作GIF表情包 动态图制作方法
- 写在2022的尾巴上
- PNETlab最新版介绍与下载