Pregunta

Tengo dos aplicaciones que estoy desarrollando usando Qt en Windows. Quiero que el usuario pueda presionar un botón en una aplicación, lo que hace que la otra aplicación aparezca en primer plano. (Los programas se comunican usando QLocalSocket y canalizaciones con nombre).

Actualmente estoy usando Qtidget QWidget :: enableWindow () que ocasionalmente pone la aplicación en primer plano, pero la mayoría de las veces solo resalta el programa en la barra de tareas.

¿Puede alguien decirme cómo hacer esto, preferiblemente usando Qt, aunque si falla, usar la API WIN32 estaría bien?


Desafortunadamente, no pude encontrar una manera de hacer esto solo con Qt. Lo resolví utilizando la sugerencia de Chris Becke de llamar a SetForegroundWindow desde la aplicación actualmente activa.

¿Fue útil?

Solución

¿Está seguro de que este no es un problema de depuración? El acuerdo es que, si una aplicación TIENE el primer plano, se le permite cambiar el primer plano.

Al hacer clic en un botón en la ventana A, se activará el subproceso de Windows en primer plano. Si llama a SetForegroundWindow (o equivalente) en la otra ventana, esa ventana se dará el primer plano.

Si, por otro lado, simplemente envía un mensaje a la otra aplicación, que intenta establecer SetForeground en sí mismo, eso fallará. AllowSetForegroundWindow se usa en situaciones en las que una aplicación 'heredada' necesita permiso, por una aplicación en primer plano, para tomar el primer plano. Una vez más, AllowSet ... solo funciona si se llama desde un subproceso que posee la ventana de primer plano activa actual.

Otros consejos

En la parte superior del método QWidget :: enableWindow , debe llamar a QWidget :: raise !

Esto es lo que se dice aquí .

Tengo un caso similar.

Tengo dos aplicaciones Qt, A y B, que se comunican en un socket. Me gustaría abrir una ventana de la aplicación B, a través de un botón en la aplicación A.

Descubrí que a veces el estado del widget no está configurado correctamente, por lo que en la función event () del widget de mis aplicaciones B hice lo siguiente:

bool MyWidgetB:event ( QEvent * e )
{
    QEvent::Type type = e->type ();

    // Somehow the correct state of window is not getting set,
    // so doing it manually
    if( e->type() == QEvent::Hide)
    {
        this->setWindowState(WindowMinimized);
    }
    else if( e->type() == QEvent::Show )
    {
        this->setWindowState((this->windowState() & ~WindowMinimized) |
                                 WindowActive);
    }
    return QWidget::event(e);
}

Estoy enviando un comando de la aplicación A a la B. Al recibirlo, la aplicación B llama a la siguiente función:

void BringUpWidget(QWidget* pWidget)
{
   pWidget ->showMinimized(); // This is to bring up the window if not minimized
                              // but beneath some other window

   pWidget ->setWindowState(Qt::WindowActive);
   pWidget ->showNormal();
}

Esto funciona para mí, en Windows & nbsp; XP , con Qt 3.3. Mi MainWidget se deriva de un QWidget .

He encontrado que esto también funciona con un widget derivado de QMainWindow , pero con algunos problemas. Como si algunas otras ventanas secundarias estuvieran abiertas.

Para tal caso, almaceno la posición de las ventanas secundarias y las oculto, luego uso la función BringUpWidget para traer mi widget MainWindow , y luego restauro las ventanas secundarias .

Esto es un poco cursi, pero funciona para mí:

            this->setWindowFlags(Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint);
            this->show();
            this->setWindowFlags(Qt::FramelessWindowHint);
            this->show();

O, si no tiene otras banderas,

            this->setWindowFlags(Qt::WindowStaysOnTopHint);
            this->show();
            this->setWindowFlags(0);
            this->show();

WindowStaysOnTopHint casi siempre forzará la ventana al primer plano. Después, realmente no desea que la ventana permanezca siempre en la parte superior, por lo que debe restablecer las marcas anteriores.

Creo que las API que necesita son AllowSetForegroundWindow () y SetForegroundWindow () . No sé cuáles son las llamadas Qt equivalentes.

Use showNormal () para pasar de un estado iconificado a un estado visible.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top