点击按钮后,Wt C ++使窗口无法点击

时间:2017-11-10 13:28:20

标签: c++ wt

编辑:以下解决方案

使用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));
}

3 个答案:

答案 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' });" ) ;

以取消冻结屏幕。