Wt C++按钮单击后使窗口不可单击

Wt C++ make window unclickable after button click

本文关键字:单击 窗口 C++ 按钮 Wt      更新时间:2023-10-16

>编辑:下面的解决方案

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

这应该有效:

button->clicked(button, &WPushButton::disable);
button->clicked(boost::bind(&Service::burn, this));

因此,您可以使用第一个处理程序禁用 UI,然后使用第二个处理程序启动繁重的长进程。

如果将这两个处理程序放入单个调用中,则它不起作用,因为在调用完成之前,UI 更改不会传播到浏览器。

Wt 在事件处理完成之前不会将小部件树修改发送到浏览器,这意味着 pf 按钮禁用的效果在 some_long_func 完成后才会变得可见。

解决此问题的一种方法是在禁用按钮后和调用some_long_func之前调用 wApp->processEvents((。这将导致小部件树的中间更新立即发送到浏览器。因此,按钮 clicked(( 处理程序可以如下所示(作为确保信号处理程序执行顺序的一个函数(:

{
  spec_button->disable();
  wApp->processEvents();
  some_long_func();
}

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

以解冻屏幕。