2014-11-12 10 views
5

Ora ho 1 applicazione, ma non voglio aprire l'applicazione due volte, quindi utilizzando QShareMemory per rilevare l'applicazione quando è aperta due volte. E la mia domanda è: come mostro l'applicazione corrente sullo schermo quando l'utente apre l'applicazione il secondo?Come si mostra un'applicazione quando si apre nuovamente l'applicazione Qt

int main(int argc, char *argv[]) { 
    Application a(argc, argv); 

    /*Make sure only one instance of application can run on host system at a time*/ 
    QSharedMemory sharedMemory; 
    sharedMemory.setKey ("Application"); 
    if (!sharedMemory.create(1)) 
    { 

     qDebug() << "123123Exit already a process running"; 
     return 0; 

    } 
    /**/ 

    return a.exec(); 
} 

Grazie.

+1

hanno una bandiera in SHM per notificare la vostra applicazione in esecuzione per eseguire un aumento o mettere il WinID in shm per alzare la finestra usando le chiamate native. –

+0

Sto usando HWND hWnd = :: FindWindowA() alla chiave fint/Nome dell'applicazione, e dopo, usando :: SetForegroundWindow (hWnd) per ripristinarlo. Grazie Sebastian Lange –

+0

Un codice specifico WIN32 sarebbe accettabile come soluzione oppure è necessaria una soluzione multipiattaforma? – jpo38

risposta

4

Ecco un altro approccio in modo Qt puro:

Usa QLocalServer e QLocalSocket per verificare l'esistenza di applicazione e quindi utilizzare il meccanismo del segnale slot per notificare quello esistente.

#include "widget.h" 
#include <QApplication> 
#include <QObject> 
#include <QLocalSocket> 
#include <QLocalServer> 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 

    const QString appKey = "applicationKey"; 

    QLocalSocket *socket = new QLocalSocket(); 
    socket->connectToServer(appKey); 

    if (socket->isOpen()) { 
     socket->close(); 
     socket->deleteLater(); 
     return 0; 
    } 
    socket->deleteLater(); 

    Widget w; 
    QLocalServer server; 

    QObject::connect(&server, 
        &QLocalServer::newConnection, 
        [&w]() { 
     /*Set the window on the top level.*/ 
     w.setWindowFlags(w.windowFlags() | 
         Qt::WindowStaysOnTopHint); 
     w.showNormal(); 
     w.setWindowFlags(w.windowFlags() & 
         ~Qt::WindowStaysOnTopHint 
         ); 
     w.showNormal(); 
     w.activateWindow(); 
    }); 
    server.listen(appKey); 

    w.show(); 

    return a.exec(); 
} 

Ma se si sta utilizzando Qt 5.3 su Windows, c'è un bug per QWidget::setWindowFlags e Qt::WindowStaysOnTopHint, vedere https://bugreports.qt.io/browse/QTBUG-30359.

Problemi correlati