Qt - 更改光标为沙漏并禁用光标

9

我目前正在开发一款Qt程序。为了防止用户在执行长时间任务时与应用程序进行交互,我尝试通过调用覆盖光标来实现。

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

然而,鼠标单击事件并没有被禁用。

是否有办法在不禁用GUI的所有小部件的情况下禁用鼠标单击事件?

3个回答

10

我花了很多时间去寻找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
这里有一个不同的方法可以帮助我的应用程序:当处理用户事件时,新的鼠标点击/按钮按下通常只有在当前运行任务调用Q(Core)Application::processEvents()时才能被处理。这经常被用来强制重绘,例如当进度条改变时。请注意,这也可能是任何包含Qt为基础的第三方库的一部分。
如果你想改变这些调用,请使用
QApplication::processEvents( QEventLoop::ExcludeUserInputEvents );

在您执行长时间任务时发生的鼠标单击事件将在任务完成后处理。当然,有时您可能不想延迟用户输入事件,因此您必须检查每个processEvents()调用。
如果您的第三方库中有processEvents()调用,并且您无法更改它们,我恐怕您会陷入同样的问题。

processEvents 可能会很棘手,特别是在 processEvents 中收到 Quit-Notificaton 的情况下。除鼠标事件外,键盘事件也将被过滤。因此关闭应用程序也可能被禁用。 - Jens
长时间任务的中断确实是一个问题。如果您想要这样做,我猜自己编写事件循环将是唯一的可能性。 - Tim Meyer

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接