Domanda

Ho due applicazioni che sto sviluppando usando Qt su Windows. Voglio che l'utente sia in grado di premere un pulsante in un'applicazione per mettere in primo piano l'altra applicazione. (I programmi comunicano usando QLocalSocket e named pipe.)

Attualmente sto usando QWidget :: activWindow () di Qt che occasionalmente porta in primo piano l'applicazione, ma il più delle volte mette in evidenza il programma sulla barra delle applicazioni.

Qualcuno può dirmi come fare, preferibilmente usando Qt anche se non funziona che l'API WIN32 andrebbe bene.


Sfortunatamente, non sono riuscito a trovare un modo per farlo solo con Qt. L'ho risolto usando il suggerimento di Chris Becke di chiamare SetForegroundWindow dall'applicazione attualmente attiva.

È stato utile?

Soluzione

Sei sicuro che questo non sia un problema di debug? L'accordo è che, se un'applicazione ha il primo piano, è consentito cambiare il primo piano.

Facendo clic su un pulsante nella finestra A, quel thread di Windows verrà attivato in primo piano. Se chiama SetForegroundWindow (o equivalente) sull'altra finestra, verrà visualizzata la finestra in primo piano.

Se, d'altra parte, invia semplicemente un messaggio all'altra app, che tenta di impostare SetForeground su se stesso, ciò fallirà. AllowSetForegroundWindow viene utilizzato in situazioni in cui un'app 'legacy' deve avere l'autorizzazione - da un'app in primo piano - per prendere il primo piano. Ancora una volta, AllowSet ... funziona solo se chiamato da un thread che possiede l'attuale finestra attiva in primo piano.

Altri suggerimenti

Oltre al metodo QWidget :: activWindow , dovresti chiamare QWidget :: raise !

Questo è ciò che si dice qui .

Ho un caso simile.

Ho due applicazioni Qt, A e B, che comunicano su un socket. Vorrei aprire una finestra dell'applicazione B, tramite un pulsante sull'applicazione A.

Ho scoperto che a volte lo stato del widget non è impostato correttamente, quindi nella funzione event () del widget delle mie applicazioni B ho fatto quanto segue:

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

Sto inviando un comando dall'applicazione A a B. Alla sua ricezione, l'applicazione B chiama su sé la seguente funzione:

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

Questo funziona per me, su Windows & nbsp; XP , con Qt 3.3. Il mio MainWidget è derivato da un QWidget .

Ho scoperto che funziona anche con un widget derivato da QMainWindow , ma con alcuni problemi. Come se fossero aperte altre finestre secondarie.

In tal caso, memorizzo la posizione delle finestre figlio e le nascondo, quindi uso la funzione BringUpWidget per portare il mio widget MainWindow e quindi ripristinare le finestre secondarie .

Questo è un po 'di formaggio, ma funziona per me:

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

Oppure, se non hai altre bandiere,

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

WindowStaysOnTopHint forzerà quasi sempre la finestra in primo piano. Successivamente, non vuoi davvero che la finestra rimanga sempre in primo piano, quindi ripristina qualsiasi sia la bandiera precedente.

Penso che le API necessarie siano AllowSetForegroundWindow () e SetForegroundWindow () . Non so quali siano le chiamate Qt equivalenti.

Usa showNormal () per passare da uno stato iconificato a uno stato visibile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top