Qt-изменить курсор на песочные часы и отключить курсор
В настоящее время я работаю над программой Qt. Чтобы предотвратить взаимодействие пользователя с приложением при выполнении длинной задачи, я попытался переопределить курсор по телефону
QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
однако события щелчка мыши не отключаются.
есть ли способ отключить события щелчка мыши без отключения всех виджетов GUI?
3 ответов
Я потратил много времени, чтобы найти способ на самом деле предотвращение взаимодействия с пользователем в 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.
Если вы измените эти звонки
QApplication::processEvents( QEventLoop::ExcludeUserInputEvents );
щелчки мыши, которые произойдет во время вашей длинной задачи будет обработано после того, как задача будет выполнена. Конечно, могут быть случаи, когда вы не хотите задерживать события пользовательского ввода, поэтому вам нужно проверить это для каждого вызова processEvents ().
Если у ваших сторонних библиотек есть вызовы processEvents (), и вы не можете их изменить, вы застрянете с той же проблемой, которую я боюсь.