c++ - 实现可编写脚本的按钮行为
问题描述
我正在为我的 C++ 项目开发自定义轻量级 UI 库,并且我对实现控件的行为有疑问。
目前我有从提供的文件创建控件实例的系统,因此图形表示、文本、尺寸和其他参数在外部文件中定义。关于按钮和其他交互式控件:我有基本按钮类,并且对于每个按钮,我正在创建派生类,并使用自己的行为相关方法(onClick() 等)实现,请参见伪代码段:
class Button
{
public:
Button();
virtual void onClick();
};
class newButton : public Button
{
void onClick()
{}//specific implementation
};
我正在寻找外部描述行为的方法(可能是脚本语言)并将其插入到编译时基本按钮的特定实例中,因此我不需要创建按钮的子类,并且按钮/组件可以在外部文件中完全描述。任何困难或建议将不胜感激。
谢谢
解决方案
好吧,我认为您遇到了另一个XY 问题:使用运行时对象多态性无法解决您的愿望。虽然它使 C++ 代码不关心使用哪个具体实现,并且可以在运行时接受新的未知解决方案,但这些新解决方案仍然必须使用 C++ 编译器进行编译,并符合基类定义和 C++ 实现(您的gcc 或 MSVC 等编译器)运行时多态性的特定细节。
因为我假设你不想要那个,这也是有道理的,并且是在 C++ 世界中流行的一种模式(参见 QML 或 Javascript/C++ 混合),你有一些选择。
您可以在 C++ 中实现所有基本行为构建块(当然您可以在其中使用运行时多态性甚至编译时多态性),然后在运行时根据您的 UI 描述语言简单地组合它们。要解析您所谓的 DSL 即 UI 描述语言,您可以使用 boost spirit 之类的库。
但是,如果您真的要编写 UI 逻辑脚本而不是简单地描述它,则必须设计和实现一门完整的编程语言,该语言也与您的 C++ 实现运行时对象多态性兼容。我会发现这是一项非常大而漫长的任务。
但是不要失望,这是现成的解决方案,例如 Javescript/C++,采用原生节点模块或 QML/Qt 或lua(一种脚本语言,专门设计用于其他编程语言)的形式反应原生和电子。
推荐阅读
- javascript - Telegram Web 如何设法隐藏贴纸的 URL?
- typescript - 从容器中获取正确类型的对象
- linux - 如何在远程 linux 服务器上启动 jhs 并从远程客户端(如 chromebook)访问它
- python-3.x - python3 urllib导入错误
- wolfram-mathematica - 在给定组下求解
- security - 我应该在哪里使用 elasticsearch.js 将生成的授权令牌放在 node.js 请求中?
- spring-boot - payara micro的maven原型
- azure - Azure Service Fabric 重置
- php - PHP - SQL - 查询不起作用
- sql - sql 中返回表的函数(Postgres SQL)