1.关于QT中的Graphics绘图,定时器,动画,将窗口中的内容打印到图片上,打印机,打印预览
1
新建项目
A
修改pro中的内容如下:
|
HEADERS MyWidget.h SOURCES MyWidget.cpp QT |
B
编写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绘图,定时器,动画,将窗口中的内容打印到图片上,打印机,打印预览的更多相关文章
- Qt Creator中的3D绘图及动画教程(参照NeHe)
Qt Creator中的3D绘图及动画教程(参照NeHe) http://blog.csdn.net/cly116/article/details/47184729 刚刚学习了Qt Creator,发 ...
- vue开发中vue-resource + canvas 图片压缩、上传、预览
1.使用vue-resource上传,也可以自定义ajax上传: 2.使用<input type="file" @change="submit()" na ...
- github 上如何直接预览仓库中的html,搭建自己的主页
前言:最近在写vue+element ui 的一些demo,就在github上建了个仓库来管理,但是希望能直接在github上就能预览效果,所以才有了这篇文章.转载请注明出处:https://www. ...
- 解决vue-router中this.$router.push无法在新窗口中打开
解决vue-router中this.$router.push无法在新窗口中打开 let routeData = this.$router.resolve({ path: '/consult', que ...
- spyder中让生成的图像单独在窗口中显示
IPython 支持两种形式的绘图 终端输出图像新窗口输出图像方式 1 能够非常方便的保存输出记录(如将`IPython 终端输出转换成 Html 文件) 方式 2 则可以交互式的放大.拖动图片,并且 ...
- 在附件管理模块中增加对FTP 上传和预览的支持
在之前介绍的附件管理模块里面<Winform开发框架之通用附件管理模块>以及<Winform开发框架之附件管理应用>,介绍了附件的管理功能,通过对数据库记录的处理和文件的管理, ...
- vue中实现图片全屏缩放预览,支持移动端
# 安装 npm install vue-photo-preview --save # 引入 import preview from 'vue-photo-preview' import 'vue-p ...
- form表单系列中文件上传及预览
文件上传及预览 Form提交 Ajax 上传文件 时机: 如果发送的[文件]:->iframe, jQurey(),伪Ajax 预览 import os img_path = os.path.j ...
- OpenGL编程逐步深入(三)在窗口中显示一个三角形
这一节教程的内容会比较少,我们仅仅是对上一节教程中的代码进行扩展,在窗口中渲染一个三角形出来. 本节我们以下图所示正方形来讲解OpenGl中的坐标系统.当沿着Z轴负方向看时,可见顶点的坐标必须在这个正 ...
随机推荐
- [测试题]神在夏至祭降下了神谕(oracle)
Description 我们村子在过去的 400 年中, 断绝与下界的接触, 过着自给自足的生活.夏至祭是一场迎接祖灵于夏季归来, 同时祈求丰收的庆典.村里的男人会在广场上演出夏之军和冬之军的战争. ...
- [HEOI2016]排序
题目描述 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题,需要你来帮助他.这个难题是这样子 的:给出一个1到n的全排列,现在对这个全排列序列进 ...
- 【Codeforces Round #431 (Div. 1) D.Shake It!】
·最小割和组合数放在了一起,产生了这道题目. 英文题,述大意: 一张初始化为仅有一个起点0,一个终点1和一条边的图.输入n,m表示n次操作(1<=n,m<=50),每次操作是任选一 ...
- [BZOJ]1017 魔兽地图DotR(JSOI2008)
BZOJ第一页做着做着就能碰到毒题,做到BZOJ1082小C就忍了,没想到下一题就是这种东西.这种题目不拖出来枭首示众怎么对得起小C流逝的青春啊. Description DotR (Defense ...
- bzoj 1835: [ZJOI2010]基站选址
Description 有N个村庄坐落在一条直线上,第i(i>1)个村庄距离第1个村庄的距离为Di.需要在这些村庄中建立不超过K个通讯基站,在第i个村庄建立基站的费用为Ci.如果在距离第i个村庄 ...
- hdu4605 树状数组+离散化+dfs
Magic Ball Game Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- [bzoj4922]Karp-de-Chant Number
来自FallDream的博客,未经允许,请勿转载,谢谢. 卡常数被称为计算机算法竞赛之中最神奇的一类数字,主要特点集中于令人捉摸不透,有时候会让水平很高的选手迷之超时. 普遍认为卡常数是埃及人Qa'a ...
- [NOI2012]
来自FallDream的博客,未经允许,请勿转载,谢谢. 一天一套noi 简直了.... 昨天勉强做完了noi2011 今天教练又丢出来一套noi2012 去掉提答还有5题 勉强做了3题 先占个坑 ...
- quartz问题记录-missed their scheduled fire-time
这里有3个原因:1.所有的woker thread(工作线程; 辅助线程)都在运行其他的job2.scheduler(调度器)down了(关于这个down.我不太明确是shutdown了..还是挂掉了 ...
- Atom 编辑器安装 linter-eslint 插件,并配置使其支持 vue 文件中的 js 格式校验
安装方式有如下几种. 1.最常用的安装方式. # 进入atom插件文件夹 cd ~/.atom/packages/ # git clone 插件源文件 git clone https://github ...