2011-07-05 14 views
7

Actualmente estoy trabajando en un programa Qt. Para evitar que el usuario interactúa con la aplicación cuando una tarea larga se está ejecutando, probé overriding the cursor llamandoQt - cambie el cursor al reloj de arena y deshabilite el cursor

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

Sin embargo, los eventos de clic del ratón no están deshabilitados.

¿Hay alguna forma de desactivar los eventos de clic del mouse sin deshabilitar todos los widgets de GUI?

Respuesta

8

Pasé mucho tiempo buscando la manera de en realidad evitar la interacción del usuario en Qt y ocurre que el filtrado de eventos parece ser una solución aceptable.

Aquí un ejemplo:

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); 
} 

Luego, cuando se lo permite bloquear:

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

y desbloquear:

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

setOverrideCursur solo cambia la apariencia del cursor. Para deshabilitar la entrada del usuario, puede abrir un cuadro de diálogo de progreso o filtrar eventos de mouse/teclado en el bucle de evento.

0

Aquí es un enfoque diferente que ayudaron para mi aplicación: Mientras que un evento de usuario se está procesando, nuevos clics del ratón/pulsaciones de botón en general sólo se procesan cuando la tarea se ejecuta actualmente llama Q (Core) Aplicación :: processEvents(). A menudo, esto se usa para forzar el repintado, p. cuando una barra de progreso cambia Tenga en cuenta que esto también puede ser parte de cualquier biblioteca de terceros basada en Qt incluida.

Si cambia estas llamadas a clics

QApplication::processEvents(QEventLoop::ExcludeUserInputEvents); 

de ratón que se producen durante su larga tarea será procesada después de la tarea se lleva a cabo. Por supuesto, puede haber ocasiones en las que no desee retrasar los eventos de entrada del usuario, por lo que debe verificarlo para cada llamada a processEvents().

Si sus libs de terceros tienen llamadas a processEvents() y no puede cambiarlas, se te va a atascar el mismo problema que me temo.

+0

processEvents puede ser complicado, especialmente si recibe una Quit- Notificacion dentro de processEvents. Además de los eventos del mouse, los eventos del teclado se filtrarían también. Por lo tanto, el cierre de la aplicación también podría desactivarse. – Jens

+0

La interrupción de tareas más largas es un problema. Si quieres eso, supongo que un solo ciclo de eventos será la única posibilidad. –

Cuestiones relacionadas