2.一个类完成所有功能
任务:一个简单的按钮类(QPushButton),能显示点击次数。
我们希望这个简单的gui程序能满足:
1.接收用户驱动事件,比如用户点击鼠标。
2.保存应用程序逻辑,将驱动事件转化成应用程序状态改变。
3.保存应用程序的状态。
4.将状态视觉化。
代码如下:
counter.h
#ifndef COUNTER_H #define COUNTER_H #include <QPushButton> class Counter : public QPushButton { Q_OBJECT public: explicit Counter(QWidget *parent = 0); protected: void mouseReleaseEvent(QMouseEvent *e); private: int m_clickTimes; void update(); };
#endif // COUNTER_H
counter.cpp
#include "counter.h" Counter::Counter(QWidget *parent) : QPushButton(parent) { m_clickTimes = 0; update(); } void Counter::mouseReleaseEvent(QMouseEvent *e) { m_clickTimes += 1; update(); } void Counter::update() { setText(QString::number(m_clickTimes)); }
main.cpp
#include <QApplication> #include "counter.h" int main(int argc, char *argv[]) { QApplication a(argc, argv);
Counter button; button.show(); return a.exec(); }
Counter类继承自QPushButton。Counter类:
1.成员变量m_clickTimes中保存鼠标的点击次数。
2.程序中改变m_clickTimes的逻辑:每次鼠标点击,触发mouseRelease事件,调用mouseRelease()函数,m_clickTimes自增。
3.调用updata方法,同步显示按钮的值和m_clickTimes的值。
对于复杂的gui程序,这个程序是一个好的起点。适合gui新手,但不适用于大程序。当程序状态,用户事件,布局频繁变化的情况下,观察如下问题:
1.从外部获得当前的状态是非常困难的。(外部不可能得到m_clickTimes的值)。
2.其他可视化对象展示相同的信息是困难的(比如一个进度条也来展示点击次数)。
3.这个类很难测试,唯一的方法是调用公用的接口来测试,实际上是不现实的(公用的方法只有构造函数,无法测试)。
4.视觉逻辑(控件布局,更新按钮的状态)、互动逻辑(鼠标点击)、业务逻辑(m_clickTimes自增)都是不同性质的。最好把这些代码分开,有利于调试!