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自增)都是不同性质的。最好把这些代码分开,有利于调试!

posted @ 2017-05-27 13:31  billxyd  阅读(316)  评论(0编辑  收藏  举报