编辑:以下解决方案
使用Wt(版本3)C ++框架: 单击调用函数的WPushButton时:
button->clicked(boost::bind(&Service::burn, this));
如何以这种方式冻结屏幕(或所有按钮),在功能运行时(运行很长时间)不能点击任何内容。目前,当Service :: burn()函数运行时,我可以单击其他按钮,这些按钮在Service :: burn()函数完成后排队并执行。
请注意,冻结后需要恢复所有按钮/屏幕。还有一个功能:
解决方案:
Wt::WPushButton* spec_button;
void testclass::test_only()
{
spec_button = new Wt::WPushButton("slow func");
auto some_long_func = [&](){
cout << "#######start \n";
std::this_thread::sleep_for(std::chrono::seconds(1));
cout << "#######end \n";
spec_button->setDisabled(false);
};
content()->addWidget(spec_button);
spec_button->clicked().connect(spec_button, &WPushButton::disable);
spec_button->clicked().connect(boost::bind<void>(some_long_func));
}
答案 0 :(得分:1)
这应该有效:
button->clicked(button, &WPushButton::disable);
button->clicked(boost::bind(&Service::burn, this));
因此,您使用第一个处理程序禁用UI,然后使用第二个处理程序启动重型流程。
如果你将这两个处理程序放在一个单独的调用中,它就不会起作用,因为UI更改不会传播到浏览器,直到该调用结束。
答案 1 :(得分:0)
在事件处理完成之前,Wt不会向浏览器发送小部件树修改,这意味着在some_long_func完成之后,效果pf按钮禁用将不会显示。
解决此问题的一种方法是在禁用按钮之后和调用some_long_func之前调用wApp-&gt; processEvents()。这将导致窗口小部件树的中间更新立即发送到浏览器。按钮clicked()处理程序因此看起来像这样(作为一个函数来确保信号处理程序的执行顺序):
{
spec_button->disable();
wApp->processEvents();
some_long_func();
}
答案 2 :(得分:0)
Wt应用程序有一个主容器,其中包含我自己的类,例如:
WtMain::WtMain ( void )
:Wt::WContainerWidget ( ) {
setId ( "wkmain-apps" ) ;
}
此类在指针C_Main上创建。 当我冻结所有应用程序时,请运行:
C_Main->doJavaScript ( "$('#wkmain-apps').css({'opacity': 0.5,'z-index': 5,'pointer-events': 'none' });" ) ;
当您的函数完成工作时,请执行以下操作:
C_Main->doJavaScript ( "$('#wkmain-apps').css({'opacity': 1,'z-index': 'auto','pointer-events': 'all' });" ) ;
以取消冻结屏幕。