【问题标题】:Qt - change cursor to hourglass and disable cursorQt - 将光标更改为沙漏并禁用光标
【发布时间】:2011-07-05 09:04:00
【问题描述】:

目前我正在开发一个 Qt 程序。为了防止用户在运行长任务时与应用程序交互,我尝试通过调用overriding the cursor

QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));

但是,鼠标点击事件并没有被禁用。

有什么方法可以在不禁用所有 GUI 小部件的情况下禁用鼠标点击事件?

【问题讨论】:

    标签: qt mouse-cursor


    【解决方案1】:

    我花了很多时间来寻找一种方法来实际上阻止 Qt 中的用户交互,并且事件过滤似乎是一个可以接受的解决方案。

    这里是一个例子:

    class AppFilter : public QObject
    {
    protected:
        bool eventFilter( QObject *obj, QEvent *event );
    };
    
    bool AppFilter::eventFilter(QObject *obj, QEvent *event)
    {
        switch ( event->type())
        {
        //list event you want to prevent here ...
        case QEvent::KeyPress:
        case QEvent::KeyRelease:
        case QEvent::MouseButtonRelease:
        case QEvent::MouseButtonPress:
        case QEvent::MouseButtonDblClick:
        //...
        return true;
        }
        return QObject::eventFilter( obj, event );
    }
    

    那么当你锁定什么时:

    qapp->setOverrideCursor(Qt::WaitCursor);
    qapp->installEventFilter(filter);
    

    然后解锁:

    while( qapp->overrideCursor()) //be careful application may have been lock several times ...
        qapp->restoreOverrideCursor();
    qapp->removeEventFilter(filter);
    

    【讨论】:

      【解决方案2】:

      setOverrideCursur 只改变光标的外观。 要禁用用户输入,您可以弹出进度对话框或在事件循环中过滤鼠标/键盘事件。

      【讨论】:

        【解决方案3】:

        以下是对我的应用程序有帮助的另一种方法:在处理用户事件时,通常仅在当前运行的任务调用 Q(Core)Application::processEvents() 时才处理新的鼠标单击/按钮按下。这通常用于强制重新绘制,例如当进度条改变时。请注意,这也可能是任何包含的基于 Qt 的第 3 方库的一部分。

        如果您将这些调用更改为

        QApplication::processEvents( QEventLoop::ExcludeUserInputEvents );
        

        长时间任务期间发生的鼠标点击将在任务完成后处理。当然,在某些情况下您可能不想延迟用户输入事件,因此您必须检查每个 processEvents() 调用。

        如果您的 3rd 方库有 processEvents() 调用并且您无法更改它们,那么您将遇到同样的问题,我担心。

        【讨论】:

        • processEvents 可能很棘手,尤其是当您在 processEvents 中收到退出通知时。除了鼠标事件,键盘事件也会被过滤。因此也可以禁用关闭应用程序。
        • 较长任务的中断确实是一个问题。如果你愿意,我想自己的事件循环将是唯一的可能性。
        猜你喜欢
        • 2012-11-09
        • 1970-01-01
        • 2015-03-28
        • 1970-01-01
        • 2018-04-08
        • 2017-02-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多