Qt中建立場景並將該創景顯示在視窗上面例項
QPainter 是一個畫家類
畫紙有好多種:視窗,印表機,QPixmap;
影像類:QPixmap, QImage, QBitmap, QPicture;
經常用的是QPixmap;效能比較高,各個系統中介面是一樣的,但是影像是根據各個系統優化過的;QImage:與平臺不關,都是一樣的;
該例項主要的功能是:
1.建立一個場景,在該場景中新增部件,比如:圖片,文字,直線等等
2.新增動畫,將靜態部件(如圖片)變為動態部件;有一個時間線;
3.右鍵點選該視窗部件,將該視窗的場景儲存到一個圖片上面;
3.右鍵點選該視窗部件,將該視窗的場景輸入到印表機預覽;
4.右鍵點選該視窗部件,將該視窗的場景輸入到印表機直接列印(此處是列印為pdf檔案);
5.畫家可以直接將文字列印;
6.簡單的使用定時器;
mywidget.cpp
畫紙有好多種:視窗,印表機,QPixmap;
影像類:QPixmap, QImage, QBitmap, QPicture;
經常用的是QPixmap;效能比較高,各個系統中介面是一樣的,但是影像是根據各個系統優化過的;QImage:與平臺不關,都是一樣的;
該例項主要的功能是:
1.建立一個場景,在該場景中新增部件,比如:圖片,文字,直線等等
2.新增動畫,將靜態部件(如圖片)變為動態部件;有一個時間線;
3.右鍵點選該視窗部件,將該視窗的場景儲存到一個圖片上面;
3.右鍵點選該視窗部件,將該視窗的場景輸入到印表機預覽;
4.右鍵點選該視窗部件,將該視窗的場景輸入到印表機直接列印(此處是列印為pdf檔案);
5.畫家可以直接將文字列印;
6.簡單的使用定時器;
mywidget.h
#ifndef MYWIDGET_H
#define MYWIDGET_H
#include <QWidget>
#include <QGraphicsScene>//場景
//#include <QGraphicsItem>//場景的東西
#include <QGraphicsLineItem>//線
#include <QGraphicsPixmapItem>//影像
#include <QGraphicsView>//顯示場景
#include <QGraphicsPixmapItem>
#include <QGraphicsItemAnimation>//動畫
#include <QTimeLine>
#include <QPrintDialog> //列印
#include <QPrintPreviewDialog>//列印預覽
#include <QTimer>//定時器
class MyWidget : public QWidget
{
Q_OBJECT
public:
explicit MyWidget(QWidget *parent = 0);
void paintEvent(QPaintEvent *);
void resizeEvent(QResizeEvent *);
void mousePressEvent(QMouseEvent *);
QGraphicsScene *_scene;//場景
QGraphicsView * _view;//顯示場景
QTimer * _timer;
signals:
public slots:
void slotPaintRequested(QPrinter *);
void slotTimeout();
};
#endif // MYWIDGET_H
mywidget.cpp
#include <QApplication>
#include "mywidget.h"
#include <QVBoxLayout>
#include <QMouseEvent>
#include <QDebug>
#include <QPainter>
#include <QPixmap>
#include <QPrinter>
MyWidget::MyWidget(QWidget *parent) :
QWidget(parent)
{
QGraphicsLineItem * lineItem;
QGraphicsTextItem * textItem;
QGraphicsPixmapItem *pixmapItem;
//QVBoxLayout *layout = new QVBoxLayout(this);
_view = new QGraphicsView(this);
// _view->setBackgroundBrush(Qt::red);
//layout->addWidget(_view);
_view->setScene(_scene = new QGraphicsScene);
_scene->addItem(lineItem = new QGraphicsLineItem(QLineF(QPoint(0, 0), QPoint(100, 100))));
_scene->addItem(textItem = new QGraphicsTextItem("Hello World"));
_scene->addItem(pixmapItem = new QGraphicsPixmapItem(QPixmap("../aaa.png")));
QTransform trans;
trans.rotate(15);//選擇15度
textItem->setTransform(trans);//"Hello World"旋轉15度
textItem->setPos(QPointF(200, 200));
textItem->setFont(QFont("Times", 30, 20, true));
pixmapItem->setPos(QPointF(100, 0));
//動畫animation
QGraphicsItemAnimation *animation = new QGraphicsItemAnimation;
animation->setItem(pixmapItem);
QTimeLine *timeline = new QTimeLine(3000);
timeline->setLoopCount(3);//設定迴圈次數為1次
animation->setTimeLine(timeline);//設定時間
//animation->setRotationAt();
animation->setTranslationAt(1, 200, 200);//會從 100, 100移動到200, 200
// timeline->start();//動畫開始
#if 0
_timer = new QTimer();
_timer->setInterval(3000);
connect(_timer, SIGNAL(timeout()), this, SLOT(slotTimeout()));
_timer->start();
#endif
QTimer::singleShot(300, this, SLOT(slotTimeout()));
}
void MyWidget::slotTimeout()
{
qDebug() << "timeout";
//sender()->deleteLater();//釋放掉該定時器
}
void MyWidget::paintEvent(QPaintEvent *)
{
}
void MyWidget::mousePressEvent(QMouseEvent *ev)
{
//右鍵點選該視窗,儲存該視窗的內容
if(ev->button() == Qt::RightButton){
#if 0
//儲存該場景view
QPixmap pixmap(size());
QPainter painter(&pixmap);
painter.fillRect(QRect(0, 0, size().width(), size().height()), Qt::white);//先將pixmap畫為白色
// _scene->render(&painter);//render,渲染,畫,向pixmap中畫
_view->render(&painter);//和上面的語句效果是一樣的
pixmap.save("../bbb.png");
#endif
#if 0
//右鍵列印預覽該部件內容
QPrintPreviewDialog dig;
connect(&dig, SIGNAL(paintRequested(QPrinter*)), this, SLOT(slotPaintRequested(QPrinter*)));
dig.exec();
#endif
#if 1
//真正的列印,因為沒有印表機,但是它可以列印成pdf的檔案;
QPrintDialog dig;
connect(&dig, SIGNAL(accepted(QPrinter*)), this, SLOT(slotPaintRequested(QPrinter*)));//
dig.exec();
#endif
}
}
void MyWidget::slotPaintRequested(QPrinter *printer)//QPrinter繼承自QPaintDevice,是一個裝置;
{
//我們用painter向該裝置中畫東西;
QPainter painter(printer);
// this->render(&painter);//把widget中顯示的東西都送到painter中,也就是送到印表機裡;把視窗部件的所有內容都列印
// _view->render(&painter);//僅僅是把當前視窗中顯示內容列印下來;render函式相當於是拷貝
_scene->render(&painter);//可以把視窗的內容列印下來
//painter.drawText(QRectF(200, 200, 100, 100), "Hello World");//將Hello World列印
}
void MyWidget::resizeEvent(QResizeEvent *)
{
//設定_vew的大小等於視窗的大小
_view->setGeometry(QRect(QPoint(0, 0), size()));
}
int main(int argc, char **argv)
{
QApplication app(argc, argv);
MyWidget w;
w.setGeometry(400, 400, 600, 500);
w.show();
app.exec();
}
列印預覽的時候右鍵點選該視窗會出現下面的介面:
如果是直接列印的話,會出現下面的介面:
如果是儲存視窗部件的場景到2.png,儲存的圖片2.png如下圖所示
相關文章
- qt視窗居中顯示QT
- Qt中設定視窗居中顯示QT
- qt設定視窗在桌面居中顯示QT
- Qt視窗在螢幕上居中顯示QT
- Qt之彈出介面顯示在父視窗中間QT
- Qt場景中圖形項的刪除QT
- Qt 設定視窗居中顯示QT
- Qt5:視窗居中顯示QT
- Qt視窗螢幕居中顯示QT
- jQuery將div在視窗中垂直居中例項程式碼jQuery
- redis應用場景及例項Redis
- Qt 讓彈出的視窗居中顯示QT
- 觀察者模式應用場景例項模式
- Qt5.12視窗螢幕居中顯示QT
- Qt如何讓彈出的視窗居中顯示QT
- Qt 把窗體顯示在螢幕的中心QT
- qt介面佈局之使視窗顯示出現在正中間位置QT
- Docker開發例項之應用場景Docker
- window.open()實現彈出視窗居中顯示程式碼例項
- 創新推出 | Serverless 場景排查問題利器:函式例項命令列操作Server函式命令列
- 將MYSQL資料顯示在QT的tablewidget中/將QT中的資料儲存到MYSQL資料庫中MySqlQT資料庫
- PHP 觀察者模式應用場景例項詳解PHP模式
- Qt之設定窗體居中顯示QT
- Go Qt5 建立空白視窗、視窗居中及關閉視窗事件GoQT事件
- Android之什麼場景該使用單例模式總結Android單例模式
- 單例模式常見場景單例模式
- 單例模式應用場景:單例模式
- 並行和非並行在不通場景中的效能差異並行
- 什麼場景應該用MongoDB ?MongoDB
- wps演示中在工作列中顯示所有視窗怎麼設定
- div始終在視窗中垂直水平居中程式碼例項
- Qt程式設計技巧 窗體居中顯示QT程式設計
- 場景在關卡設計中的比重
- JS 中 this 在各個場景下的指向JS
- 巧用列舉來處理UI中顯示值與業務值不同的場景UI
- 基於角色的訪問控制並根據不同的場景顯示不同的反饋資訊
- Qt中MainWindow類例項QTAI
- Serverless 場景排查問題利器:函式例項命令列操作Server函式命令列