1
新建项目


修改pro中的内容如下:

HEADERS
+=
\

MyWidget.h

SOURCES
+=
\

MyWidget.cpp

QT
+=
gui widgets
printsupport


编写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绘图,定时器,动画,将窗口中的内容打印到图片上,打印机,打印预览的更多相关文章

  1. Qt Creator中的3D绘图及动画教程(参照NeHe)

    Qt Creator中的3D绘图及动画教程(参照NeHe) http://blog.csdn.net/cly116/article/details/47184729 刚刚学习了Qt Creator,发 ...

  2. vue开发中vue-resource + canvas 图片压缩、上传、预览

    1.使用vue-resource上传,也可以自定义ajax上传: 2.使用<input type="file" @change="submit()" na ...

  3. github 上如何直接预览仓库中的html,搭建自己的主页

    前言:最近在写vue+element ui 的一些demo,就在github上建了个仓库来管理,但是希望能直接在github上就能预览效果,所以才有了这篇文章.转载请注明出处:https://www. ...

  4. 解决vue-router中this.$router.push无法在新窗口中打开

    解决vue-router中this.$router.push无法在新窗口中打开 let routeData = this.$router.resolve({ path: '/consult', que ...

  5. spyder中让生成的图像单独在窗口中显示

    IPython 支持两种形式的绘图 终端输出图像新窗口输出图像方式 1 能够非常方便的保存输出记录(如将`IPython 终端输出转换成 Html 文件) 方式 2 则可以交互式的放大.拖动图片,并且 ...

  6. 在附件管理模块中增加对FTP 上传和预览的支持

    在之前介绍的附件管理模块里面<Winform开发框架之通用附件管理模块>以及<Winform开发框架之附件管理应用>,介绍了附件的管理功能,通过对数据库记录的处理和文件的管理, ...

  7. vue中实现图片全屏缩放预览,支持移动端

    # 安装 npm install vue-photo-preview --save # 引入 import preview from 'vue-photo-preview' import 'vue-p ...

  8. form表单系列中文件上传及预览

    文件上传及预览 Form提交 Ajax 上传文件 时机: 如果发送的[文件]:->iframe, jQurey(),伪Ajax 预览 import os img_path = os.path.j ...

  9. OpenGL编程逐步深入(三)在窗口中显示一个三角形

    这一节教程的内容会比较少,我们仅仅是对上一节教程中的代码进行扩展,在窗口中渲染一个三角形出来. 本节我们以下图所示正方形来讲解OpenGl中的坐标系统.当沿着Z轴负方向看时,可见顶点的坐标必须在这个正 ...

随机推荐

  1. [HAOI2008]糖果传递

    题目描述 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1. 输入输出格式 输入格式: 小朋友个数n 下面n行 ai 输出格式: 求使所有人获得均等糖果 ...

  2. [SDOI2005]反素数

    题目描述 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4. 如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数.例如,整数1,2,4,6 ...

  3. 【BZOJ4196】【Noi2015】软件包管理器

    原题传送门 题意: 给你一棵树,有2种操作: 1.使得某个点到根节点路径上的所有点权值赋为1. 2.使得某节点的子树中所有节点权值赋为0. 每次操作要求输出权值更改的节点个数. 解题思路: 显然是用树 ...

  4. hdu 5274 Dylans loves tree(LCA + 线段树)

    Dylans loves tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Othe ...

  5. 关于快速沃尔什变换(FWT)的一点学习和思考

    最近在学FWT,抽点时间出来把这个算法总结一下. 快速沃尔什变换(Fast Walsh-Hadamard Transform),简称FWT.是快速完成集合卷积运算的一种算法. 主要功能是求:,其中为集 ...

  6. bzoj3262陌上花开 cdq分治

    3262: 陌上花开 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 2794  Solved: 1250[Submit][Status][Discus ...

  7. SpringBoot多环境部署,在启动时动态设置相应的配置文件

    项目中,往往在测试环境和正式环境拥有不同的配置,例如数据库连接,第三方库的appkey等.这时候,我们就要在不同的环境启用不同的配置 下面新建三个文件,分别表示开发环境,生产环境和测试环境的配置文件 ...

  8. ubuntu上的附件-终端和用快捷键ctrl+alt+f1 有啥区别

    ctrl +alt +Fn 打开的是模拟终端,简单说来,linux系统一开机会自动打开6个模拟终端,然后自动切换到其中一个(一般来说是切换到图形界面的那个也就是说窗口管理器是在这6个模拟终端中运行的) ...

  9. JavaScript实现简单的双向数据绑定

    什么是双向数据绑定 双向数据绑定简单来说就是UI视图(View)与数据(Model)相互绑定在一起,当数据改变之后相应的UI视图也同步改变.反之,当UI视图改变之后相应的数据也同步改变. 双向数据绑定 ...

  10. Java 实现32位MD5加密

    MD5介绍[链接] Java代码实现 public class Md5Util { private String Md5Util(String s) { try { MessageDigest md ...