项目的工程文件结构图:
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: