Qt - изменить курсор на песочные часы и отключить курсор - PullRequest
7 голосов
/ 05 июля 2011

В настоящее время я работаю над программой Qt.Чтобы пользователь не мог взаимодействовать с приложением, когда выполняется длинная задача, я попытался переопределить курсор , вызвав

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

Однако события щелчка мыши не отключены.

Есть ли способ отключить события щелчка мышью, не отключая все виджеты GUI?

Ответы [ 3 ]

8 голосов
/ 05 июля 2011

Я потратил много времени, чтобы найти способ на самом деле предотвратить взаимодействие с пользователем в 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);
0 голосов
/ 05 июля 2011

Вот другой подход, который помог моему приложению: во время обработки пользовательского события новые щелчки мышью / нажатия кнопок обычно обрабатываются только тогда, когда текущая выполняемая задача вызывает Q (Core) Application :: processEvents (). Это часто используется для перекраски, например когда индикатор выполнения меняется. Обратите внимание, что это может быть частью любых включенных сторонних библиотек на основе Qt.

Если вы измените эти вызовы на

QApplication::processEvents( QEventLoop::ExcludeUserInputEvents );

щелчков мыши, которые происходят во время вашей длинной задачи, будут обработаны после выполнения задачи. Конечно, могут быть случаи, когда вы не хотите откладывать события пользовательского ввода, поэтому вы должны проверять это для каждого отдельного вызова processEvents ().

Если у ваших сторонних библиотек есть вызовы processEvents (), и вы не можете их изменить, вы столкнетесь с той же проблемой, которую я боюсь.

0 голосов
/ 05 июля 2011

setOverrideCursur изменяет только внешний вид курсора.Чтобы отключить пользовательский ввод, вы можете открыть диалоговое окно прогресса или отфильтровать события мыши / клавиатуры в цикле событий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...