目录名字

  • 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 的翻译相关推荐

  1. Qt文档阅读笔记-官方2D Painting Example实例解析

    目录 2D Painting Example Overview Helper Class Definition Helper Class Implementation Widget Class Def ...

  2. Qt 2D绘图之二:抗锯齿渲染和坐标系统

    一.抗锯齿渲染 1.1 逻辑绘图 图形基元的大小(宽度和高度)始终与其数学模型相对应,下图示意了忽略其渲染时使用的画笔的宽度的样子. 1.2 物理绘图(默认情况) 在默认的情况下,绘制会产生锯齿,并且 ...

  3. Qt 2D绘图功能简单总结

    文章目录 Qt 2D绘图功能简单总结 Qt 2D绘图功能简单总结 Qt 的绘图功能非常强大,它可以绘制一切想要的图形,从最简单的一条直线到其他任何复杂的图形,还可以用来绘制文本和图片. Qt的绘图系统 ...

  4. Qt 系统下的qm翻译文件

    一.使用背景 如果,当你使用QMessageBox.QFileDialog等系统提供的方法时,可能打开的界面中有个控件提示信息未汉化. 其实,qt是提供的qm翻译文件的,所以我们可以使用它来进行翻译了 ...

  5. qt中制作添加 .ts 翻译文件

    qt中制作添加 .ts 翻译文件 QT 中可以用其自身的工具对界面语言进行翻译,以实现支持语言的效果,这对于开发用户跨越语言区域的工具来说是一个特别实用的功能. 下面介绍怎么制作和使用qt的翻译文件: ...

  6. Google Cartographer 《Real-Time Loop Closure in 2D LIDAR SLAM》翻译 (中英对照)

    Google Cartographer <Real-Time Loop Closure in 2D LIDAR SLAM>翻译 (中英对照) 作者: Wolfgang Hess, Damo ...

  7. Qt 2D绘图(5):绘制图像基础

    Qt 2D绘图(5):绘制图像基础 本文为原创文章,转载请注明出处,或注明转载自"黄邦勇帅(原名:黄勇) 本文出自本人原创著作<Qt5.10 GUI完全参考手册>网盘地址: ht ...

  8. 在VS中实现QT的多国语言翻译

    QT的多国语法翻译非常的实用,可以将开发完成的软件,直接翻译成另外一种语言,而不需要更改代码,也就是说一次开发可以同时发布多个语言版本的软件. 翻译过程 创建翻译文件:从代码中自动提取出能翻译的文本, ...

  9. Qt 信号量 QSemaphore Class 的翻译

    关于 Qt QSemaphore class 的翻译 Qt 的 QSemaphore class 提供了一个通用的信号量(可以是单一的,也可以是数量多个的)的使用方法. 需要编辑环境添加: Heade ...

最新文章

  1. 64位十六进制转浮点数
  2. CentOS-7.2部署OpenLDAP服务器以及客户端
  3. 除了《深入理解 Java 虚拟机》,还可以看怎么系统学习 Java 虚拟机?
  4. python3多线程第三方库_Python之多线程爬虫抓取网页图片的示例代码
  5. 【正一专栏】新赛季欧冠小组赛猜想
  6. 【CTR模型】TensorFlow2.0 的 DeepFM 实现与实战(附代码+数据)
  7. 网易云课堂解析_使用SQL分析网易云课堂职场提升类课程
  8. 点击空链接,页面不跳到页头
  9. mysql mvcc undo_Mysql Innodb中undo-log和MVCC多版本一致性读 的实现
  10. TurboMail助某水利委员会邮件通讯更新换血
  11. 记事本编程开发以及IDEA编程开发
  12. 程 | 深度学习 + OpenCV,Python 实现实时视频目标检测 机器之心 09-21
  13. 申请计算机助理的英语作文,各位帮我找一篇英文申请信大学英语作文,申请助理..._口译笔译考试_帮考网...
  14. VisualStudio各版本的安装与使用(持续更新)
  15. 列表套字典三者匹配对应关系
  16. 猜一猜,我国第一次大规模应用二维码是什么时候?
  17. 计算机相关经典书籍推荐
  18. 哪个软件可以制作GIF表情包 动态图制作方法
  19. 写在2022的尾巴上
  20. PNETlab最新版介绍与下载

热门文章

  1. Linux下PDF操作与转换
  2. 【比赛】论如何七天内在研究生电子设计竞赛中拿国奖
  3. Matlab对话框总结
  4. [云炬创业管理笔记]第九章为创业成败而准备测试1
  5. [云炬创业基础笔记]第七张创业团队测试7
  6. [云炬创业基础笔记] 第四章测试6
  7. Matlab神经网络十讲(7): Self-Organizing and LVQ Networks
  8. Linux下的编程入门
  9. code ro rw zi 编译的一个ARM的程序,编译结果中的一句话
  10. Java中static关键字有什么用?