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

  • 相关阅读:
    eclipse报错:发现了以元素 'd:skin' 开头的无效内容。此处不应含有子元素
    深入解析_Android的自定义布局
    RSA算法加密解密
    android版本
    TabHost+RadioGroup搭建基础布局
    android横竖屏控制
    一大波静态方法
    有时候
    简单的dialog菜单
    mongodb学习(三)——函数使用的小技巧
  • 原文地址:https://www.cnblogs.com/billxyd/p/6912490.html
Copyright © 2020-2023  润新知