【问题标题】:Kind of RAII to manage GUI state in Qt在 Qt 中管理 GUI 状态的 RAII 类型
【发布时间】:2014-06-05 22:20:51
【问题描述】:

我想知道您是否认为在 Qt 中使用类似于 RAII 的模式来管理 GUI 状态是否合理。通过 GUI 状态,我的意思如下:我有一些小部件(包括鼠标光标状态)我想在离开某些方法后(不)可见/启用/更改,我不想把我所做的一切都放进去一个巨大的尝试以这种方式捕获:

widget1->show();
...
widgetN->show();

try {
   ...
}
catch(...) {
   widget1->hide();
   ... 
   widgetN->hide();

   throw;
}

widget1->hide();
... 
widgetN->hide();

如果我创建一个对象,允许我在其构造函数上关联 hide/setEnabled/setCursor 函数(可能是 boost 函子),并在其析构函数上调用此关联函数(前提是该函数可以抛出的所有异常都被吃掉/迷失在析构函数中)我可以有一个更清晰的代码。这合理吗?我没看到什么?

非常欢迎任何评论/建议。

提前致谢,

费德里科

【问题讨论】:

标签: c++ user-interface qt4 design-patterns


【解决方案1】:

这是完全合理的。您所追求的技术称为 ScopeGuard,在 Boost 中称为 ScopeExit。

这个想法是,当您第一次进行更改时,您定义一些要在作用域末尾运行的代码,然后处理其余的代码。如果需要,您可以“关闭”代码。

我会打一个例子,但我在手机上。

【讨论】:

    【解决方案2】:

    RAII 用于处理资源,它不像某些人可能认为的那样受限制。在许多情况下,“资源”可以替换为“状态”。

    如果您将控件的可见性等同于存储状态,并且您需要安全地回收该状态(将其设置为不可见),那么在析构函数中重置它是可行的方法。

    您正确使用了 RAII。

    请务必为您的类命名,这样可以清楚地表明您将可见性视为一次性资源 - 可能像 VisibleStateIsVisibleContext 这样简单。

    【讨论】:

      【解决方案3】:

      我已经完成了 C++ lambda 和 2 个宏:

      #include <functional>
      
      struct _Scope_Exit_ {
              inline _Scope_Exit_(const std::function<void ()> f): _f(f) {}
              inline ~_Scope_Exit_() { _f(); }
              const std::function<void ()> _f;
      };
      
      #define SCOPE_EXIT_CAT2(x, y) x##y
      #define SCOPE_EXIT_CAT1(x, y) SCOPE_EXIT_CAT2(x, y)
      #define SCOPE_EXIT _Scope_Exit_ SCOPE_EXIT_CAT1(_scope_Exit_, __COUNTER__)([this](){
      #define SCOPE_EXIT_END });
      

      要使用它,您必须在SCOPE_EXITSCOPE_EXIT_END 之间的方法末尾定义要执行的块

      在您的示例中是:

      widget1->show();
      ...
      widgetN->show();
      
      SCOPE_EXIT
         widget1->hide();
         ... 
         widgetN->hide();
      SCOPE_EXIT_END
      
      ... (code inside your try)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-09-01
        • 2011-12-19
        • 1970-01-01
        • 2020-08-01
        • 1970-01-01
        • 2018-03-13
        • 1970-01-01
        相关资源
        最近更新 更多