首页 > 解决方案 > 实现可编写脚本的按钮行为

问题描述

我正在为我的 C++ 项目开发自定义轻量级 UI 库,并且我对实现控件的行为有疑问。

目前我有从提供的文件创建控件实例的系统,因此图形表示、文本、尺寸和其他参数在外部文件中定义。关于按钮和其他交互式控件:我有基本按钮类,并且对于每个按钮,我正在创建派生类,并使用自己的行为相关方法(onClick() 等)实现,请参见伪代码段:

class Button
{
public:
   Button();
   virtual void onClick();
};

class newButton : public Button
{
   void onClick()
   {}//specific implementation
};

我正在寻找外部描述行为的方法(可能是脚本语言)并将其插入到编译时基本按钮的特定实例中,因此我不需要创建按钮的子类,并且按钮/组件可以在外部文件中完全描述。任何困难或建议将不胜感激。

谢谢

标签: c++user-interfacescripting

解决方案


好吧,我认为您遇到了另一个XY 问题:使用运行时对象多态性无法解决您的愿望。虽然它使 C++ 代码不关心使用哪个具体实现,并且可以在运行时接受新的未知解决方案,但这些新解决方案仍然必须使用 C++ 编译器进行编译,并符合基类定义和 C++ 实现(您的gcc 或 MSVC 等编译器)运行时多态性的特定细节。

因为我假设你不想要那个,这也是有道理的,并且是在 C++ 世界中流行的一种模式(参见 QML 或 Javascript/C++ 混合),你有一些选择。

您可以在 C++ 中实现所有基本行为构建块(当然您可以在其中使用运行时多态性甚至编译时多态性),然后在运行时根据您的 UI 描述语言简单地组合它们。要解析您所谓的 DSL 即 UI 描述语言,您可以使用 boost spirit 之类的库。

但是,如果您真的要编写 UI 逻辑脚本而不是简单地描述它,则必须设计和实现一门完整的编程语言,该语言也与您的 C++ 实现运行时对象多态性兼容。我会发现这是一项非常大而漫长的任务。

但是不要失望,这是现成的解决方案,例如 Javescript/C++,采用原生节点模块或 QML/Qt 或lua(一种脚本语言,专门设计用于其他编程语言)的形式反应原生和电子。


推荐阅读