zoukankan      html  css  js  c++  java
  • Button控制窗体变量(开关控制灯的状态)

    现在在用Qt做一个智能家居的项目,解决了一个问题,拿出来分享一下:

    为了描述简单,按钮用DirectButton来表示,窗体用Form来表示。

    介绍:一个窗体代表一个家电(如压力锅),在窗体上有一些按钮,如开关,煮饭,煮粥之类的,让开关按钮能够控制其他按钮,即只有电器是开的时候其他按钮才能按下。因为DirectButtonDirectButton是独立不相关的,因此,通过窗体这个共同体的变量来控制。

    问题:DirectButton类和Form 类是两个独立的类,对象之间不能互相访问对象的成员。

    方法:通过建立一个监听类来解决,这个类如下:

    IPowerInfoListener.h

    #ifndef IPOWERINFOLISTENER_H
    #define IPOWERINFOLISTENER_H
    class IPowerInfoListener
    {
    
    public:
        virtual bool isOn() = 0;
    };
    #endif // IPOWERINFOLISTENER_H

    IPowerControlListener.h

    #ifndef IPOWERCONTROLLISTENER_H
    #define IPOWERCONTROLLISTENER_H
    #include"IPowerInfoListener.h"
    
    
    class IPowerControlListener : public IPowerInfoListener
    {
    
    public:
        virtual void power_on() = 0;
        virtual void power_off() = 0;
    };
    #endif // IPOWERCONTROLLISTENER_H

    然后,让Button有一个IPowerControlListener类的数据成员,代码如下:

    button.h

    #ifndef BUTTON_H
    #define BUTTON_H
    #include <QtGui/QPushButton>
    #include<command.h>
    #include"IPowerControlListener.h"
    
    class Q_GUI_EXPORT Button : public QPushButton
    {
        Q_OBJECT
    public:
        Button(Command command, IPowerControlListener *powerListener = 0);
        IPowerControlListener *listner;
    
    };
    #endif // BUTTON_H

    button.cpp

    Button::Button(Command command, IPowerControlListener *powerListener)
    {
        this->listner = powerListener;
    }

    再继承Button类:

    class Q_GUI_EXPORT DirectButton : public Button
    {
        Q_OBJECT
    
    public:
        DirectButton(QWidget *parent = 0);
        DirectButton(int loc_id, QWidget *parent = 0);
        DirectButton(QString desc, QWidget *parent = 0);
        DirectButton(Command command, IPowerControlListener *listener = 0);
        ~DirectButton(){}
    
        bool execute();
    
    protected:
        int parseInstrument();
        //int mode_id;
    };
    bool DirectButton::execute()
    {
    
        unsigned char a[4];
        bool ok = false;
        //the instrucments need to transfer.
        a[0] = (unsigned char)this->command().op_mac.toInt(&ok, 16);
        a[1] = (unsigned char)this->command().op_type.toInt(&ok, 16);
        a[2] = (unsigned char)this->command().op_code.toInt(&ok, 16);
        a[3] = (unsigned char)this->command().op_num.toInt(&ok, 16);
        //find the SPI
        char *str[] = {"/dev/ttyS0", "/dev/ttyS1", "/dev/ttyS2", "/dev/ttyS3"};
        int i = this->command().spi;
        this->SendCommand(a, str[i]);
        return true;
    }

    同理,让窗体继承类IPowerControlListener

    代码如下:

    form.h

    class Appliance : public QWidget, public IPowerControlListener
    {
        Q_OBJECT
    public:
        Appliance(QString strMac,QString strType, int intSpi, QWidget *parent = 0);
        ~Appliance();
        void Init(QString strMac,QString strType, int intSpi);
        void power_on();//open
        void power_off();//off
        bool isOn();//the status
    }

    这样子以来,DirectButton在界面生成时,Form被作为参数传入了DirectButton,成为了DirectButton的一个数据成员。

    我们可以通过:

    this->listner->power_on();
    
    this->listner->power_off();

    这两个函数来修改this.listner->isOn()

    在Form中,我们在通过

    DirectButton* btn = qobject_cast<DirectButton*>(sender());
        if(btn->listner->isOn())
            btn->execute();

    来判断电器是否处于开的状态来控制

  • 相关阅读:
    硬件IC汇总
    stm8s103调试注意点
    感悟短句
    USB接口
    液晶屏驱动注意
    四数之和
    所有奇数长度子数组的和
    秋叶收藏集
    删除中间节点
    组合总和
  • 原文地址:https://www.cnblogs.com/wiessharling/p/3045719.html
Copyright © 2011-2022 走看看