1.关于QT中的Graphics绘图,定时器,动画,将窗口中的内容打印到图片上,打印机,打印预览
1
新建项目
A
修改pro中的内容如下:
|
HEADERS MyWidget.h SOURCES MyWidget.cpp QT |
B
编写MyWidget.h
#ifndef MYWIDGET_H #define MYWIDGET_H #include <QWidget> #include <QGraphicsScene> #include <QGraphicsLineItem> #include <QGraphicsPixmapItem> #include <QGraphicsTextItem> #include <QGraphicsPixmapItem> #include <QGraphicsItemAnimation> #include <QTimeLine> #include <QPrintPreviewDialog> // preview #include <QPrintDialog> // print // display scene #include <QGraphicsView> #include <QTimer> #include <QDateTime> class MyWidget : public QWidget {
Q_OBJECT public: explicit MyWidget(QWidget *parent); void paintEvent(QPaintEvent *); QGraphicsScene* _scene; // data model QGraphicsView* _view; // show the data model void resizeEvent(QResizeEvent *); void mousePressEvent(QMouseEvent *); QTimer* _timer; signals: public slots: void slotPaintRequested(QPrinter*); void slotTimeout(); }; #endif // MYWIDGET_H |
C
编写MyWidget.cpp,内容如下:
#include "MyWidget.h" #include <QApplication> #include <QVBoxLayout> #include <QMouseEvent> #include <QDebug> #include <QPrinter> MyWidget::MyWidget(QWidget *parent) : QWidget(parent) {
QGraphicsLineItem* lineItem; QGraphicsTextItem* textItem; QGraphicsPixmapItem* pixmapItem; //定义一个view _view = new QGraphicsView(this); //让view的背景颜色编程黄色的 _view->setBackgroundBrush(Qt::yellow); //在view中添加scene _view->setScene(_scene = new QGraphicsScene); //在scene中添加一条线 _scene->addItem(lineItem = new QGraphicsLineItem(QLineF(QPointF(0, 0), QPointF(100, 100)))); //在scene中画线 _scene->addItem(textItem = new QGraphicsTextItem("Hello world"));
//在scene中添加一个pixmap _scene->addItem(pixmapItem = new QGraphicsPixmapItem(QPixmap("../aaa.png")));
//定义一个转换 QTransform trans; //度 trans.rotate(30); textItem->setPos(QPointF(0, 300)); textItem->setTransform(trans); textItem->setFont(QFont("aaa", 50, 700, true));
pixmapItem->setPos(100, 100); //Animation 等价于 cocos2dx中的Action(动作) QGraphicsItemAnimation* animation = new QGraphicsItemAnimation; animation->setItem(pixmapItem); //设置一个事件线,表示执行一次动作所需要的时间,以毫秒值为参数 QTimeLine* timeline = new QTimeLine(3000); //表示这个动作循环执行多少次 timeline->setLoopCount(2); //这个动画开始以timeline为配置执行动作 animation->setTimeLine(timeline); //秒内,移动到200,200这个位置 animation->setTranslationAt(1, 200, 200); //开始执行 timeline->start(); /**************上面代码是可以独立运行的****************/ //下面的方式定义一个定时器 _timer = new QTimer(); //秒钟执行一次 _timer->setInterval(1000); //使信号和槽函数联系起来执行 connect(_timer, SIGNAL(timeout()), this, SLOT(slotTimeout())); _timer->start(); //下面的方法让定时器只执行一次 //QTimer::singleShot(1000, this, SLOT(slotTimeout())); } /** * @brief MyWidget::slotTimeout 秒钟会执行下面的函数一次 */ void MyWidget::slotTimeout() {
qDebug() << "Time out"; } //上面运行出的结果如下: void MyWidget::resizeEvent(QResizeEvent *) {
// set the size of _view = MyWidget::size _view->setGeometry(QRect(QPoint(0, 0), size())); } void MyWidget::paintEvent(QPaintEvent *) {
} /* * QPixmap 平台优化了的一种图,人看起来是一样的,但是在不同的平台,调用的不同平台的底层接口 * QImage 在所有的平台都是一样的,这里是一个位图 * QBitmap 灰度图 * QPicture 说白了就是一个轨迹图,通过这个轨迹图能够画图图像 */ void MyWidget::mousePressEvent(QMouseEvent *ev) {
if(ev->button() == Qt::RightButton) {
#if 0 //只需放开下面的代码即可执行,放开这里的时候,当右击鼠标的 //时候发现在相应的目录下出现了图片 // save the view 通过下面的一段代码实现了将窗口中的内容保存到图片上了 // 这里的size()是窗口的大小 QPixmap pixmap(size()); QPainter painter(&pixmap); painter, size().width(), size().height()), Qt::white); _view->render(&painter); pixmap.save("../bbb.png");
//这里运行的结果如下: #endif #if 0 //下面是打印预览的功能,放开此处的时候右击鼠标的时候会出现打印预览的功能 QPrintPreviewDialog dlg; connect(&dlg, SIGNAL(paintRequested(QPrinter*)), this, SLOT(slotPaintRequested(QPrinter*))); dlg.exec(); //这里的运行结果如下: #endif #if 0 //下面的打印的功能,放开此处会出现让选择打印机的窗口 QPrintDialog dlg; connect(&dlg, SIGNAL(accepted(QPrinter*)), this, SLOT(slotPaintRequested(QPrinter*))); dlg.exec(); //这里的运行结果如下: #endif } } void MyWidget::slotPaintRequested(QPrinter *printer) {
QPainter painter(printer); _scene->render(&painter); //说明直接可以通过painter打印出文字 painter.drawText(QPoint(100, 100), "Fuck"); } int main(int argc, char* argv[]) {
QApplication app (argc,argv); MyWidget w; w.showMaximized(); return app.exec(); } |
1.关于QT中的Graphics绘图,定时器,动画,将窗口中的内容打印到图片上,打印机,打印预览的更多相关文章
- Qt Creator中的3D绘图及动画教程(参照NeHe)
Qt Creator中的3D绘图及动画教程(参照NeHe) http://blog.csdn.net/cly116/article/details/47184729 刚刚学习了Qt Creator,发 ...
- vue开发中vue-resource + canvas 图片压缩、上传、预览
1.使用vue-resource上传,也可以自定义ajax上传: 2.使用<input type="file" @change="submit()" na ...
- github 上如何直接预览仓库中的html,搭建自己的主页
前言:最近在写vue+element ui 的一些demo,就在github上建了个仓库来管理,但是希望能直接在github上就能预览效果,所以才有了这篇文章.转载请注明出处:https://www. ...
- 解决vue-router中this.$router.push无法在新窗口中打开
解决vue-router中this.$router.push无法在新窗口中打开 let routeData = this.$router.resolve({ path: '/consult', que ...
- spyder中让生成的图像单独在窗口中显示
IPython 支持两种形式的绘图 终端输出图像新窗口输出图像方式 1 能够非常方便的保存输出记录(如将`IPython 终端输出转换成 Html 文件) 方式 2 则可以交互式的放大.拖动图片,并且 ...
- 在附件管理模块中增加对FTP 上传和预览的支持
在之前介绍的附件管理模块里面<Winform开发框架之通用附件管理模块>以及<Winform开发框架之附件管理应用>,介绍了附件的管理功能,通过对数据库记录的处理和文件的管理, ...
- vue中实现图片全屏缩放预览,支持移动端
# 安装 npm install vue-photo-preview --save # 引入 import preview from 'vue-photo-preview' import 'vue-p ...
- form表单系列中文件上传及预览
文件上传及预览 Form提交 Ajax 上传文件 时机: 如果发送的[文件]:->iframe, jQurey(),伪Ajax 预览 import os img_path = os.path.j ...
- OpenGL编程逐步深入(三)在窗口中显示一个三角形
这一节教程的内容会比较少,我们仅仅是对上一节教程中的代码进行扩展,在窗口中渲染一个三角形出来. 本节我们以下图所示正方形来讲解OpenGl中的坐标系统.当沿着Z轴负方向看时,可见顶点的坐标必须在这个正 ...
随机推荐
- hdu 4578 线段树(标记处理)
Transformation Time Limit: 15000/8000 MS (Java/Others) Memory Limit: 65535/65536 K (Java/Others) ...
- Angular中 build的时候遇到的错误--There are multiple modules with names that only differ in casing
今天早上遇到一个Angular的编译的时候的错误 具体信息: There are multiple modules with names that only differ in casing.This ...
- python2.7入门---操作mysql数据库增删改查
Python 标准数据库接口为 Python DB-API,Python DB-API为开发人员提供了数据库应用编程接口.Python 数据库接口支持非常多的数据库,你可以选择适合你项目的数据库: G ...
- 西安电话面试:谈谈Vue数据双向绑定原理,看看你的回答能打几分
最近我参加了一次来自西安的电话面试(第二轮,技术面),是大厂还是小作坊我在这里按下不表,先来说说这次电面给我留下印象较深的几道面试题,这次先来谈谈Vue的数据双向绑定原理. 情景再现: 当我手机铃声响 ...
- 利用gulp把本地文件移动到指定待发布文件夹
一.目标 把本地的文件移动到待发布的文件中,把static_grab文件中file.txt所列文件列表移动到beta对应文件夹中: 二.实现 var gulp = require('gulp'), w ...
- mysql 索引列为Null的走不走索引及null在统计时的问题
要尽可能地把字段定义为 NOT NULL,即使应用程序无须保存 NULL(没有值),也有许多表包含了可空列(Nullable Column)这仅仅是因为它为默认选项.除非真的要保存 NULL,否则就把 ...
- SignalR Progress
Server public class ServerHub : Hub { public async Task<string> ALongTimeTask() { var p = new ...
- python学习之路基础篇(第八篇)
一.作业(对象的封装) 要点分析 1.封装,对象中嵌套对象 2.pickle,load,切记,一定要先导入相关的类二.上节内容回顾和补充 面向对象基本知识: 1.类和对象的关系 2.三大特性: 封装 ...
- java连接sqlserver2008
java连接sqlserver2008时应有sqljdbc4.jar驱动包.连接的示例代码如下: import java.sql.*; public class ConnectSQL { public ...
- ng-book札记——Angular工作方式
Angular应用由组件(Component)构成.它与AngularJS中的指令相似(directive). 应用 一个Angular应用本质上是一个组件树.在组件树的顶层,最上级的组件即是应用本身 ...