前面我们用QLabel对象来显示图像,QLabel对象本身也是一个窗口, 意味着窗口对着需要刷新时,共需要刷新两个窗口(其中一个是QLabel对象). 这样效率不高。 窗口对象其实也是画出来的,如在窗口对象在画出来时,也把图像直接画出来的,这样可以少画出一个子窗口对象.这样可以提高效率。
重新实现QWidget的虚函数. 此虚函数会在窗口重画时触发, 注意不是直接调用的.
virtual void paintEvent(QPaintEvent *event)
我们可以在这个函数里写上要画的什么东西的代码.
通常通过调用QPainter类对象来画.
QPainter对象一般都是在paintEvent函数里创建对象,并指定的操作对象.
QPainter提供了以下函数成员,用于画图.
drawPoint(), drawPoints(), drawLine(), drawRect(), drawRoundedRect(), drawEllipse(), drawArc(), drawPie(), drawChord(), drawPolyline(), drawPolygon(), drawConvexPolygon() and drawCubicBezier().
而且,可以设置QPainter的画笔(画出来的线条是怎样的,粗细,顔色,风格等)
void setPen(const QPen &pen)
void setPen(const QColor &color)
void setPen(Qt::PenStyle style)
// 具体的风格可以在帮助文档里查看
还可以设置QPainter的画刷(即画出来的图像内部是填充什么颜色,图像, 风格等)
void setBrush(const QBrush &brush)
void setBrush(Qt::BrushStyle style)
当需要画出字符时,还可以设置QPainter的字体。
void setFont(const QFont &font)
贪吃蛇的游戏实现:
1. 需要定时移动蛇, 可用定时器QTimer. 定时器对象超时会发出timeout信号, 需要把这个信号连接到时间处理的槽函数。并调用窗口对象的repaint成员触发paintEvent.
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(update()));
timer->start(1000)
蛇就在窗口里的paintEvent里画出来的(可以改造前面的看图程序, 实现数码相册的功能).
捕扣用户的按键事件。 重写窗口对象的keyPresseEvent虚函数
蛇每次吃到食物时,节点变多一节, 蛇节点数是不固定。用QList来存放每个节点的数据. 每个节点都 有x, y坐标, 用QPoint类对象存放.
完整工程,下载地址:
http://download.csdn.net/detail/jklinux/9840246 (已修正)