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

  • 相关阅读:
    python-44-初识队列
    python-43-进程锁/信号量/事件
    python-42-Process多进程
    python-41-初识hmac与socketserver模块
    python-40-初识socket与struct
    python-39-hashlib与logging模块
    python-38-用于面向对象的内置函数
    python-37-各种反射
    python-36-封装与面向对象函数
    python-35-多态与初识封装
  • 原文地址:https://www.cnblogs.com/billxyd/p/6912490.html
Copyright © 2011-2022 走看看