項目的工程文件結構圖:
mywidget.h:
#ifndef MYWIDGET_H #define MYWIDGET_H #include <QWidget> namespace Ui { class MyWidget; } class MyWidget : public QWidget { Q_OBJECT public: explicit MyWidget(QWidget *parent = 0); ~MyWidget(); protected: //重寫繪圖事件,虛函數 //如果在窗口繪圖,必須放在繪圖事件里實現; //繪圖事件內部自動調用,窗口需要重繪的時候(狀態改變) void paintEvent(QPaintEvent *event); private slots: void on_pushButton_clicked(); private: Ui::MyWidget *ui; int x;//定義一個橫坐標的標量 }; #endif // MYWIDGET_H
main.cpp:
#include "mywidget.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); MyWidget w; w.show(); return a.exec(); }
mywidget.cpp:
#include "mywidget.h" #include "ui_mywidget.h" #include<QPaintEvent> #include <QPainter> #include <QPen> MyWidget::MyWidget(QWidget *parent) : QWidget(parent), ui(new Ui::MyWidget) { ui->setupUi(this); x = 0;//初始化橫坐標為0 } MyWidget::~MyWidget() { delete ui; } void MyWidget::paintEvent(QPaintEvent *event) { // QPainter p(this); QPainter p;//創建畫家對象 p.begin(this);//指定當前窗口為繪圖設備 //下面可以添加繪圖操作 // p.drawArc(); //這里就先畫個背景圖 // p.drawPixmap(0,0,width(),height(),QPixmap("://res/4.jpg")); //p.drawPixmap(0,0,width(),height(),QPixmap("://res/4.jpg"));可以用以下的代碼代替,更為簡單 p.drawPixmap(rect(),QPixmap("://res/4.jpg")); //為了畫出來的線夠粗,這里使用畫筆,定義畫筆 QPen pen; pen.setWidth(5);//設置線寬 //把畫筆交給畫家 p.setPen(pen); //畫直線 p.drawLine(50,50,150,50); p.drawLine(50,50,50,150); //畫移動的圖像, p.drawPixmap(x,200,80,80,QPixmap(":/res/3.jpg")); p.end(); } /* * 利用按鈕實現當點擊按鈕的時候,圖像移動。實現手動的更新窗口 * 這里使用的是轉到槽的功能 */ void MyWidget::on_pushButton_clicked() { x += 20; if (x > width()) { x = 0; } //刷新窗口,讓窗口重繪,整個窗口都刷新(即這里實現了手動的刷新窗口) update();//間接的調用paintEvent() }
UI: