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-12-02 18:00:41

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

QT连接打印机打印是如何设置打印机打印出固定格式的内容

问题描述 QT连接打印机打印是如何设置打印机打印出固定格式的内容 如题,怎么来设置打印机的输出格式,使其固定化,还有如何打印出条形码, 解决方案 QT用zint打印条码 http://download.csdn.net/detail/morg2/7007471

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

在之前介绍的附件管理模块里面<Winform开发框架之通用附件管理模块>以及<Winform开发框架之附件管理应用>,介绍了附件的管理功能,通过对数据库记录的处理和文件的管理,实现了附件文件和记录的整合管理,可以运用在单机版的WInform框架,也可以使用在分布式的混合式开发框架中,随着一些开发场景的丰富,我们需要以FTP方式上传文件,因此对这个附件管理模块进行扩展,以便适合更多的实际项目需求. 1.FTP上传.HTTP文件预览实现思路 我们设想的附件管理,底层都是需要在Winfo

WPS演示中如何添加闪烁字幕动画

最近用WPS2005版制作做幻灯片的人越来越多了,有人想在字幕演示上有所改变,能够有一种全新的感觉,我仔细琢磨认真操作制作出了一种动画,希望大家能多提意见. 操作步骤如下: 1. 新建一个空白的幻灯片. 图片1 2. 将标题框和副标题删除,这只是为了不影响制作过程. 3. 在"绘图"工具栏中,选择"自选图形→基本形状→笑脸:)"插入幻灯片中. 图片2 4. 右键"笑脸"在弹出的快捷菜单中选择"设置对象格式"命令. 图片3 5.

java-JavaJFrame窗口中组件显示问题

问题描述 JavaJFrame窗口中组件显示问题 我在JFrame中添加了菜单栏并为菜单项添加事件(在窗口中添加一个JComponent),但是窗口中不显示! 代码如下: package frame; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Graphics; import java.awt

网页中照片预览导航设计技巧

导航并不只是指常位于网站头部的导航条,路边的指示牌.商场的指示牌等等都是一种导航,可以说导航在生活中无处不在,如果没有这些导航存在,那么我们将迷失,迷失在互联网信息的海洋中,迷失在纵横交错的马路上,迷失在琳琅满目的商品货架之间. 在所谓的WEB2.0风潮疯狂的从国外吹入国内的时候,国外一些成功网站的成功模式也疯狂的吹入到国内的模仿者的眼前.目前在国内关于网络相册方面或者时尚一点是说关于WEB2.0网络相册方面做得比较好的应该算是yupoo了,同时它也是国内模仿flickr模式最像的最成功的--事

在Windows Vista系统中预览PDF文件

之前我们曾介绍过Windows Vista的预览功能,即在用户不打开相应文件的情况下查看文件的具体内容,这是个相当有用的功能,可以大大提高日常工作的效率.Windows Vista预览功能可支持的对象包括图片.音频.视频.字体.文本.E-mail乃至Office文档如Word.Excel.PowerPoint文件. 不过,对于PDF(Portable Document Format)文件,则没有这么幸运了,即使在Windows Vista中安装了可以创建PDF的Office 2007后,仍然不能

改变窗口中的光标形状

如何在注册表中查找默认浏览器信息? 如何改变窗口中的光标形状? 如何避免资源ID冲突? 如何在注册表中查找默认浏览器位置的定义?我需要知道EXE文件的路径和名称以便启动一个应用程序会话.我的目的很简单,就是打开默认的浏览器,这样用户能够象普通程序一样使用它,而不是在我设计的程序窗口内浏览因特网. Rolf Wenger 据我所知,在Window中没有专门指定默认浏览器的注册表键值或设定值.即使专家也很难弄清楚整个注册表,更何况常人.我知道可能存在这样一个键值, HKCU\System\Mumbl

jasper-ireport,在java工程中预览PDF,被识别为文件下载

问题描述 ireport,在java工程中预览PDF,被识别为文件下载 Class.forName(driver).newInstance(); Connection conn = DriverManager.getConnection(host, user, pass); Map parameters = new HashMap(); parameters.put("SUBREPORT_DIR", reportFilePath); if (para != null &&

怎么在Windows 7系统中Word 2010 无法使用“文件-打开”预览文档

Word 有打开预览功能,点击"文件>打开",不用打开文档就可以察看其内容.当需要查找某一目标文档时,使用这项功能可以避免反复打开.关闭多个文档的操作,节省不少时间. 可是,最近升级至 Office 2010 后,Word 打开预览却显示预览器错误,无法预览 Word 文件. 收起这个图片展开这个图片   更为匪夷所思的是,Excel 和 PPT 文件的预览却是正常的.怎么回事? 原因释疑: 在预览文件时,系统会调用这个文件类型默认的打开程序.使用 Word 2010 的&quo