【问题标题】:Wt C++ make window unclickable after button clickWt C++ 在按钮点击后使窗口不可点击
【发布时间】:2018-04-23 17:57:12
【问题描述】:

编辑:下面的解决方案

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

【问题讨论】:

    标签: c++ wt


    【解决方案1】:

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

    解冻屏幕。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

        这应该可行:

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

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

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

        【讨论】:

        • 谢谢它的工作,虽然在 &Service::burn 调用之后调用 &WPushButton::enable 似乎没有启用它并且它一直处于禁用状态,有什么想法吗?
        • Service::burn 是否在单个线程中执行?你在里面叫WPushButton::Enable吗?
        • 是的,它在单个线程中执行。我尝试在函数内部和外部都调用 &WPushButton::enable 但它没有效果
        • 我发布了一个更大的代码 sn-p 以获得更清晰的视图
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-06
        • 2012-02-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-26
        相关资源
        最近更新 更多