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. [Luogu 1730]最小密度路径

    Description 给出一张有N个点M条边的加权有向无环图,接下来有Q个询问,每个询问包括2个节点X和Y,要求算出从X到Y的一条路径,使得密度最小(密度的定义为,路径上边的权值和除以边的数量). ...

  2. [SCOI2010]生成字符串

    题目描述 lxhgww最近接到了一个生成字符串的任务,任务需要他把n个1和m个0组成字符串,但是任务还要求在组成的字符串中,在任意的前k个字符中,1的个数不能少于0的个数.现在lxhgww想要知道满足 ...

  3. [HNOI2016]最小公倍数

    题目描述 给定一张N个顶点M条边的无向图(顶点编号为1,2,...,n),每条边上带有权值.所有权值都可以分解成2a∗3b2^a*3^b2a∗3b 的形式. 现在有q个询问,每次询问给定四个参数u.v ...

  4. NOIP2014-5-10模拟赛

    Problem 1 机器人(robot.cpp/c/pas) [题目描述] 早苗入手了最新的Gundam模型.最新款自然有着与以往不同的功能,那就是它能够自动行走,厉害吧. 早苗的新模型可以按照输入的 ...

  5. Unix系统使用的地址索引结构有什么特点?

    使用地址索引表.索引节点中地址索引表标识出含有文件数据的磁盘块的分布情况.

  6. 《Java技术》第一次作业——Java语言基础

    学习总结 Scanner类实现基本数据输入的方法 Scanner 使用分隔符模式将其输入分解为标记,默认情况下该分隔符模式与空白匹配.然后可以使用不同的 next 方法将得到的标记转换为不同类型的值. ...

  7. img图片占不满整个div

    解决方法: img标签自带有3px的空隙,有很多解决方法第一种:设置img{font-size:0}第二种:设置img{display:block}第三种:设置img{vertical-align:t ...

  8. Python小代码_11_生成小于 n 的裴波那契数列

    def fib(n): a, b = 1, 1 while a < n: print(a, end=' ') a, b = b, a + b fib(100000) #输出结果 #1 1 2 3 ...

  9. Python之禅及其翻译

    凡是用过 Python的人,基本上都知道在交互式解释器中输入 import this 就会显示 Tim Peters 的 The Zen of Python,但它那偈语般的语句有点令人费解,所以我想分 ...

  10. Python 字符串字典内置函数&方法

    Python字典包含了以下内置函数: 序号 函数及描述 1 cmp(dict1, dict2)比较两个字典元素. 2 len(dict)计算字典元素个数,即键的总数. 3 str(dict)输出字典可 ...