Frage

Ich habe zwei Anwendungen habe ich mit Qt unter Windows zu entwickeln. Ich möchte der Benutzer in der Lage sein eine Schaltfläche in einer Anwendung zu drücken, die die andere Anwendung in den Vordergrund stellt. (Die Programme kommunizieren QLocalSocket und Named Pipes verwenden.)

Zur Zeit bin ich mit Qt QWidget :: activateWindow (), die gelegentlich der Anwendung in den Vordergrund bringt, aber die meiste Zeit hebt sie einfach das Programm auf der Taskleiste.

Kann jemand bitte sagen Sie mir, wie Sie dies tun, vorzugsweise Qt verwenden, obwohl in Ermangelung eines solchen, die WIN32-API wäre in Ordnung.


Leider kann ich nicht einen Weg finden, diese mit Qt nur zu tun. Ich löste es Chris Becke Vorschlag mit der SetForegroundWindow aus der aktuell aktiven Anwendung aufrufen.

War es hilfreich?

Lösung

Sind Sie sicher, dass dies nicht ein Debugging-Problem? Der Deal ist, wenn eine Anwendung den Vordergrund hat, ist es erlaubt den Vordergrund zu ändern.

wird eine Schaltfläche auf Fenster A klicken, das Fenster Thread Vordergrund Aktivierung geben. Wenn es nennt SetForegroundWindow (oder gleichwertig) auf dem anderen Fenster, wird dieses Fenster in den Vordergrund gegeben werden.

Wenn auf der anderen Seite ist es einfach eine Nachricht an die andere App sendet, die sich auf sich selbst setForeground versucht, die fehlschlagen wird. AllowSetForegroundWindow wird in Situationen, in denen ein ‚Legacy‘ App Erlaubnis werden muss gegeben - durch einen Vordergrund app - in den Vordergrund zu nehmen. Wieder einmal AllowSet ... funktioniert nur, wenn von einem Thread aufgerufen, der den aktuellen aktiven Vordergrundfenster besitzt.

Andere Tipps

Auf der Oberseite der QWidget::activateWindow Methode, sollten Sie QWidget::raise rufen!

Dies ist, was gesagt wird, hier .

Ich habe einen ähnlichen Fall.

Ich habe zwei Qt Anwendungen, A und B, die auf einem Sockel zu kommunizieren. Ich mag ein Fenster der Anwendung B bis bringen, über eine Schaltfläche auf Anfrage A.

fand ich, dass manchmal das Widget Zustand nicht richtig eingestellt ist, so in der event() Funktion meines applicatons B des Widgets ich folgendes getan:

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

Ich bin ein Befehl von der Anwendung A nach B zu senden Auf ihm empfangen, Anwendung B ruft die folgende Funktion auf sich selbst:

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

Dies funktioniert für mich, auf Windows XP , mit Qt 3.3. Mein MainWidget wird von einem QWidget abgeleitet.

Ich habe gefunden, das funktioniert auch mit einem Widget von QMainWindow abgeleitet, aber mit einigen Problemen. Wie, wenn einige andere Kind Fenster geöffnet sind.

Für einen solchen Fall speichere ich die Position der untergeordneten Fenster und verstecken sie, dann die BringUpWidget Funktion verwenden, um meine MainWindow Widget zu bringen, und dann die untergeordneten Fenster wiederherstellen.

Dies ist eine Art kitschig, aber es funktioniert für mich:

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

Oder, wenn Sie nicht über andere Flaggen haben,

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

WindowStaysOnTopHint wird fast immer zwingen, das Fenster in den Vordergrund. Danach wollen Sie nicht wirklich das Fenster auf immer bleiben, so zurückgesetzt, was auch immer die bisherigen Fahnen waren.

Ich denke, die APIs, die Sie brauchen, sind AllowSetForegroundWindow () und SetForegroundWindow () . Ich weiß nicht, was die entsprechenden Qt Anrufe sind.

Mit SHOWNORMAL () geht von einem ikonifizierten Zustand in einen sichtbaren Zustand.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top