2014-11-12 13 views
5

Hiện tại, tôi có 1 ứng dụng, nhưng tôi không muốn mở ứng dụng hai lần, vì vậy tôi sử dụng QShareMemory để phát hiện ứng dụng khi mở hai lần. Và câu hỏi của tôi là: cách tôi hiển thị ứng dụng hiện tại trên màn hình khi người dùng mở ứng dụng thứ hai?Cách tôi hiển thị ứng dụng khi mở lại ứng dụng 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(); 
} 

Cảm ơn.

+1

có một lá cờ trong shm thông báo ứng dụng đang chạy của bạn để thực hiện tăng lương hoặc đặt WinId trong shm để nâng cao cửa sổ bằng cách sử dụng các cuộc gọi gốc. –

+0

Tôi đang sử dụng HWND hWnd = :: FindWindowA() để fint key/Tên ứng dụng, và sau đó, sử dụng :: SetForegroundWindow (hWnd) để khôi phục nó. Cảm ơn Sebastian Lange –

+0

Một mã WIN32 cụ thể có thể chấp nhận được như một giải pháp hay bạn cần một giải pháp đa nền tảng? – jpo38

Trả lời

4

Dưới đây là cách tiếp cận khác trong cách Qt tinh khiết:

Sử dụng QLocalServerQLocalSocket để kiểm tra sự tồn tại của ứng dụng và sau đó sử dụng cơ chế tín hiệu-khe để thông báo cho người hiện có.

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

Nhưng nếu bạn đang sử dụng Qt 5.3 trên Windows, có một lỗi cho QWidget::setWindowFlagsQt::WindowStaysOnTopHint, xem https://bugreports.qt.io/browse/QTBUG-30359.

Các vấn đề liên quan