Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 一种在Qt中管理GUI状态的RAII_C++_User Interface_Qt4_Design Patterns - Fatal编程技术网

C++ 一种在Qt中管理GUI状态的RAII

C++ 一种在Qt中管理GUI状态的RAII,c++,user-interface,qt4,design-patterns,C++,User Interface,Qt4,Design Patterns,我想知道您是否认为使用类似于RAII的模式来管理Qt中的GUI状态是合理的。通过GUI状态,我的意思是:我有一些小部件(包括鼠标光标状态),我想在离开某个方法后(不)可见/启用/更改,我不想以这种方式将我所做的一切都放在一个巨大的try catch中: widget1->show(); ... widgetN->show(); try { ... } catch(...) { widget1->hide(); ... widgetN->hide

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

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

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

   throw;
}

widget1->hide();
... 
widgetN->hide();
如果我创建了一个对象,允许我将hide/setEnabled/setCursor函数(可能是一个boost functor)关联到它的构造函数上,并在它的析构函数上调用这个关联的函数(前提是这个函数可以抛出的所有异常都在析构函数中被吃掉/丢失),那么我可以得到一个更干净的代码。这合理吗?我没看到什么

任何意见/建议都将受到欢迎

提前感谢,


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

这样做的目的是,当您第一次进行更改时,定义一些要在作用域末尾运行的代码,其余的代码将被处理。如果需要,您可以“取消”代码


我想打一个例子,但我正在打电话。

RAII是用来处理资源的,它并不像一些人认为的那样是一个受限的概念。在许多上下文中,“资源”可以替换为“状态”

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

您正确地使用了RAII


一定要命名你的类,这显然是显而易见的,你把可视性当作一种可供使用的资源——也许简单的如<代码> VisualSturt或 ISVISILBICONTEXT/<代码> .< /P> < P>我已经用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 });
这可能属于你
widget1->show();
...
widgetN->show();

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

... (code inside your try)