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. 2015 多校联赛 ——HDU5384(AC自动机)

    Sample Input 1 5 6 orz sto kirigiri danganronpa ooooo o kyouko dangan ronpa ooooo ooooo   Sample Out ...

  2. bzoj 2212: [Poi2011]Tree Rotations

    Description Byteasar the gardener is growing a rare tree called Rotatus Informatikus. It has some in ...

  3. [Noi2015]荷马史诗

    来自FallDream的博客,未经允许,请勿转载,谢谢. 追逐影子的人,自己就是影子. ——荷马 Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的 ...

  4. 初遇 Asp.net MVC 数据库依赖缓存那些事儿

    问题背景: 最近做一个非常简单的功能,就是使用ajax请求的方式从服务端请求一段下拉表的数据. 以前也有做过这个功能,只不过这次做这个功能的时候冒出了一个想法: 我请求的这段数据它是一段相对比较固定的 ...

  5. Python中内置函数的介绍

    内置函数的功能介绍 常用内置函数如下: 1.abs() 绝对值 格式:abs(x) 例如:print(abs(-18)) >>> 18 返回值:number #该函数主要用于数值类的 ...

  6. 使用JdbcTemplate过程中使用到多个参数和like模糊

    项目中经常会用到模糊查询,最近使用JdbcTemplate过程中就遇到了. 一开始尝试了拼接的方式去 String sql = "select count(1) from web_users ...

  7. CSS :focus 选择器

    :focus 选择器用于选取获得焦点的元素. <!DOCTYPE html> <html> <head> <style> input:focus { b ...

  8. asp.net用户控件引用

    <%@ Register Src="~/_module/IndexChannelHead.ascx" TagName="tn" TagPrefix=&qu ...

  9. 一口一口吃掉Hibernate(四)——多对一单向关联映射

    hibernate对于数据库的操作,全部利用面向对象的思维来理解和实现的.一般的单独表的映射,相信大家都没有问题,但是对于一些表之间的特殊关系,Hibernate提供了一些独特的方式去简化它. 今天就 ...

  10. 关于一些基础的Java问题的解答(三)

    11. HashMap和ConcurrentHashMap的区别   从JDK1.2起,就有了HashMap,正如上一个问题所提到的,HashMap与HashTable不同,不是线程安全的,因此多线程 ...