1.关于QT中的Graphics绘图,定时器,动画,将窗口中的内容打印到图片上,打印机,打印预览
生活随笔
收集整理的這篇文章主要介紹了
1.关于QT中的Graphics绘图,定时器,动画,将窗口中的内容打印到图片上,打印机,打印预览
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1 新建項目
A? 修改pro中的內容如下:
| HEADERS += \ ??? MyWidget.h ? SOURCES += \ ??? MyWidget.cpp ? QT += gui widgets printsupport |
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 = 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(); } |
?
總結
以上是生活随笔為你收集整理的1.关于QT中的Graphics绘图,定时器,动画,将窗口中的内容打印到图片上,打印机,打印预览的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: shell的输入和输出
- 下一篇: s3c2440移植MQTT