【发布时间】:2011-07-05 09:04:00
【问题描述】:
目前我正在开发一个 Qt 程序。为了防止用户在运行长任务时与应用程序交互,我尝试通过调用overriding the cursor
QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
但是,鼠标点击事件并没有被禁用。
有什么方法可以在不禁用所有 GUI 小部件的情况下禁用鼠标点击事件?
【问题讨论】:
标签: qt mouse-cursor
目前我正在开发一个 Qt 程序。为了防止用户在运行长任务时与应用程序交互,我尝试通过调用overriding the cursor
QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
但是,鼠标点击事件并没有被禁用。
有什么方法可以在不禁用所有 GUI 小部件的情况下禁用鼠标点击事件?
【问题讨论】:
标签: qt mouse-cursor
我花了很多时间来寻找一种方法来实际上阻止 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);
【讨论】:
setOverrideCursur 只改变光标的外观。 要禁用用户输入,您可以弹出进度对话框或在事件循环中过滤鼠标/键盘事件。
【讨论】:
以下是对我的应用程序有帮助的另一种方法:在处理用户事件时,通常仅在当前运行的任务调用 Q(Core)Application::processEvents() 时才处理新的鼠标单击/按钮按下。这通常用于强制重新绘制,例如当进度条改变时。请注意,这也可能是任何包含的基于 Qt 的第 3 方库的一部分。
如果您将这些调用更改为
QApplication::processEvents( QEventLoop::ExcludeUserInputEvents );
长时间任务期间发生的鼠标点击将在任务完成后处理。当然,在某些情况下您可能不想延迟用户输入事件,因此您必须检查每个 processEvents() 调用。
如果您的 3rd 方库有 processEvents() 调用并且您无法更改它们,那么您将遇到同样的问题,我担心。
【讨论】: