1.关于QT中的Graphics绘图,定时器,动画,将窗口中的内容打印到图片上,打印机,打印预览



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 = 0);
    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;
    //这个转换效果可以旋转30度
    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);
    //在1秒内,移动到200,200这个位置
    animation->setTranslationAt(1, 200, 200);
 
    //开始执行
    timeline->start();
 
    /**************上面代码是可以独立运行的****************/
    //下面的方式定义一个定时器
    _timer = new QTimer();
    //每隔1秒钟执行一次
    _timer->setInterval(1000);
    //使信号和槽函数联系起来执行
    connect(_timer, SIGNAL(timeout()), this, SLOT(slotTimeout()));
    _timer->start();
 
    //下面的方法让定时器只执行一次
    //QTimer::singleShot(1000, this, SLOT(slotTimeout()));
}
 
/**
 * @brief MyWidget::slotTimeout 每隔1秒钟会执行下面的函数一次
 */
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.fillRect(QRect(0, 0, 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();
}
时间: 2024-10-12 20:23:30

1.关于QT中的Graphics绘图,定时器,动画,将窗口中的内容打印到图片上,打印机,打印预览的相关文章

ajax中form表单中含有文件上传功能,后台语言是java,包括图片的下载,预览,删除

//样式 <li> <label>已有文档:</label> <div id="fileEdit"></div> </li> <li> <label>附件:</label> <input name="file" type="file" multiple="multiple" style="display:

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

let routeData = this.$router.resolve({ path: '/consult', query: { userid: row.adviserId, Roomid:row.courseId,role:1} });window.open(routeData.href, '_blank'); 原文地址:https://www.cnblogs.com/karila/p/9009580.html

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

文件上传及预览 Form提交 Ajax 上传文件 时机: 如果发送的[文件]:->iframe, jQurey(),伪Ajax 预览 import os img_path = os.path.join('static/img', fafafa.name) with open(img.path, 'wb') as f: for item in fafafa.chunks(): f.write(item) function iframeSubmit(){ $('#ifm1').load(functi

在 PHP 中结合 Ajax 技术进行图片上传

前面几则日志中讲述了在 PHP 中上传文件,相信大家对 PHP 中如何进行文件上传已经初步掌握.本文来继续探讨在 PHP 中上传文件的技术,不同的是,本次上传将仅限于图片文件的上传,并且将采用 Ajax 技术. 本例将要实现这样的效果:当用户选择图片,开始上传后,后台上传完成时,随即会显示到当前页面.由于,从开始上传到上传完成,再到图片显示均在一个页面上 完成(从表面上看).所以使用 Ajax 技术是必须的.但如何使用这些操作在一个页面上来完成呢?考虑到这样的情况,当文件开始上传后,便开始打开

怎么在MindManager中查看打印预览

在MindManager2016思维导图中打印导图之前,可以先进行预览,MindManager和其他很多应用程序一样都带有打印预览功能,该功能提供了再次检查的机会,避免打印出错,MindManager中的打印预览选项,可以根据所选打印设置和页面设置选项,显示要打印的导图样子,本文具体为大家讲解如何在MindManager2016中显示打印预览. 步骤一:在文件选项卡上,点击打印,然后点击打印预览:或者从打印或页面设置对话框中点击预览: 步骤二:如果已选择在多个页面上打印导图(大导图或多个幻灯片)

【项目相关】MVC中使用WebUploader进行图片预览上传以及编辑

项目中需要用到多图片上传功能,于是在百度搜了一下,首先使用了kissy uploader,是由阿里前端工程师们发起创建的一个开源 JS 框架中的一个上传组件...但,后面问题出现了. 在对添加的信息进行重新编辑的时候,这些图片怎么办?由于对js不是很熟悉,就没有想去修改这个组件的代码.只有重新寻找合适的组件,于是就找到了百度的WebUploader,下面简要描述一下该组件在MVC中的使用,包括图片的上传和预览,以及在编辑界面对图片的处理办法. 先来一张效果图: (一)图片的上传和预览 (1)下载

从web编辑器 UEditor 中单独提取图片上传,包含多图片单图片上传以及在线涂鸦功能

UEditor是由百度web前端研发部开发所见即所得富文本web编辑器,具有轻量,可定制,注重用户体验等特点,开源基于MIT协议,允许自由使用和修改代码.(抄的...) UEditor是非常好用的富文本web编辑器,而且全中文API和注释,方便学习和使用.特别是图片上传查看及涂鸦功能极为喜欢,但是有很多情况我们并不需要Web编辑器,而只需要图片上传.那么问题来了,提取图片上传哪家强..... 网上有很多图片上传的控件.插件.但都不是那么的完美,有的只有一张图片上传不包含批量上传,有的没有图片查看

Qt分析:Qt中的两种定时器(可是QObject为什么要提高定时器呢,没必要啊。。。)

Qt有两种定时器,一种是QObject类的定时器,另一种是QTimer类的定时器. (1)QObject类的定时器 QObject类提供了一个基本的定时器,通过函数startTimer()来启动,通过killTimer()来结束,通过QTimerEvent来处理定时器事件. int startTimer(int interval, Qt::TimerType timerType = Qt::CoarseTimer); void killTimer(int id); void QObject::t

用仿ActionScript的语法来编写html5——第五篇,Graphics绘图

canvas本身就是一个Graphics,可以直接进行绘图在actionscript里面,每个Sprite都有一个Graphics,Shape我先不考虑了,它更容易实现些,在Html5中,绘图都是绘在同一个canvas上面的,所以我们现在需要考虑两个问题,1,如何把每个Sprite里的Graphics在不同的时刻,画在同一个地方2,因为我们现在在不停的刷新页面,所以如果我们用Graphics绘图,那么它也需要不断的刷新 那我现在依然先假设,每一个Sprite储存的Graphics,只保存一些绘图