从外部访问类对象

Posted

技术标签:

【中文标题】从外部访问类对象【英文标题】:Accessing a class object from outside 【发布时间】:2021-06-09 10:33:06 【问题描述】:

我在 TouchGFX Designer 上创建了一个基本项目,并使用 touchgfx 库在我自己的 cpp 文件中编写了一个函数。我希望在单击按钮时,从我自己的 cpp 文件中调用 ScreenView.cpp 或 ScreenViewBase.cpp 的函数并更改框的颜色。

这是我的 cpp 文件。

#include <touchgfx/Color.hpp>
#include <touchgfx/widgets/Box.hpp>
#include <gui/screen1_screen/Screen1View.hpp>
#include <gui/screen1_screen/Screen1Presenter.hpp>
#include <touchgfx/widgets/Box.hpp>

ChangeColor::ChangeColor()

    Screen1View::box1;
    box1.setColor(touchgfx::Color::getColorFrom24BitRGB(51, 168, 35));
    box1.invalidate();

这是我要调用函数的 Screen1View.cpp。

#include<gui/ChangeColor.hpp>
#include <touchgfx/Color.hpp>

Screen1View::Screen1View():
    buttonCallback(this, &Screen1View::buttonCallbackHandler)




void Screen1View::setupScreen()

    Screen1ViewBase::setupScreen();
    button1.setAction(buttonCallback);



void Screen1View::tearDownScreen()

    Screen1ViewBase::tearDownScreen();

void Screen1View::buttonCallbackHandler(const touchgfx::AbstractButton& src)

    if (&src == &button1)
    
        //Interaction1
        //When button1 clicked execute C++ code
        //Execute C++ code
        //ChangeColor();
        ChangeColor();
    
    

这是声明盒子的 Screen1BaseView.hpp

#define SCREEN1VIEWBASE_HPP

#include <gui/common/FrontendApplication.hpp>
#include <mvp/View.hpp>
#include <gui/screen1_screen/Screen1Presenter.hpp>
#include <touchgfx/widgets/Box.hpp>
#include <touchgfx/widgets/Button.hpp>

class Screen1ViewBase : public touchgfx::View<Screen1Presenter>

public:
    Screen1ViewBase();
    virtual ~Screen1ViewBase() 
    virtual void setupScreen();

protected:
    FrontendApplication& application() 
        return *static_cast<FrontendApplication*>(touchgfx::Application::getInstance());
    

    /*
     * Member Declarations
     */
    touchgfx::Box __background;
    touchgfx::Box box1;
    touchgfx::Button button1;

private:

;

我无法访问该框。有办法吗?

【问题讨论】:

【参考方案1】:

TouchGFX 使用 MPV 架构,即 Model-Presenter-View。关键是Model和View不能互相访问。

在您的情况下,您的 cpp 文件扮演模型的角色,因此不允许访问 View 中的元素。这就是你无法访问的原因。您需要 Presenter 来处理连接。

【讨论】:

新演讲者意味着新观点,我错了吗?所以我将尝试访问已经存在的演示者。我该怎么做?有示例代码吗? presenter不代表view,实际上一个screen是由presenter和view组成的。在您的情况下,Screen1 = Screen1View + Screen1Presenter。 Screen1View 负责描述 Screen1 上显示的元素,而 Screen1Presenter 负责控制如何显示元素。只需将整个ChangeColor()复制到Screen1Presenter,然后在buttonCallbackHandler中调用presenter->ChangeColor()。请尝试自己了解 Model-Presenter-View 架构。我不能在这里向你详细解释。 如果我复制整个函数,那么拥有 ChangeColor.cpp 将毫无意义。我的目的是从外部访问视图。此外,我将整个功能复制到演示者,演示者无法访问box1。 我想告诉你要做什么的机制: 您按下屏幕上的按钮,视图会收到点击事件,在事件处理程序中,会调用演示者,然后演示者会调用模型(您的外部代码),一般来说,该模型将具有数据,例如您的颜色值。演示者将从模型中获取数据值,然后调用视图更改颜色。如果你还是不知道怎么写代码,把你的代码全部贴出来,我可能会尝试为你一一修改。

以上是关于从外部访问类对象的主要内容,如果未能解决你的问题,请参考以下文章

面向对象---内部类

java线程在创建外部对象之前访问它

java 内部类

成员内部类

java 外部类可以访问内部类private问题

在静态方法中new 一个内部类对象和new 一个外部类对象的区别