2017-01-14 2 views
0

QtSingleApplicationを使用して、qmlアプリケーションを単一インスタンスのアプリケーションにします。 しかし、他のウィンドウの前にアクティブなアプリを置くことはできません。他のウィンドウの前でQtSingleApplicationをアクティブなアプリケーションに使用するにはどうすればいいですか?

私はgithubのから最新のQtSingleApplicationコードを使用すると、以下の私の主な方法です。

#include <QQmlApplicationEngine> 
#include <QApplication> 
#include <QtQml> 
#include <QtSingleApplication> 

int main(int argc, char *argv[]) 
{ 
    QtSingleApplication app(argc, argv); 
    if (app.isRunning()) 
    { 
     // I think I should do something here 
     return 0; 
    } 

    QQmlApplicationEngine engine; 
    engine.load(QUrl(QStringLiteral("qrc:/qml/main.qml"))); 

    return app.exec(); 
} 
それを実装する方法

やQMLと完全に単一インスタンスのアプリケーションを実装するための他の方法はありますか? ありがとうございます!

答えて

0

main.cppに

QQmlApplicationEngine engine; 

     QObject* qmlObject = engine.rootObjects().at(0); 
     WindowsPlatformSpecific wps(qmlObject); 

     QObject::connect(&app, SIGNAL(messageReceived(const QString&)), 
        &wps, SLOT(handleMessage(const QString&))); 

//////////////////////

void WindowsPlatformSpecific::handleMessage(const QString& message) 
    { 
     QObject* pp = this->parent(); 
     QWindow* pWnd = qobject_cast<QWindow*>(pp); 

     if (!pWnd) 
      qInfo() <<"The winId is null"; 

     WId winId = pWnd->winId(); 
     SetForegroundWindowByWId(winId); 
    } 

////////////////////////

bool WindowsPlatformSpecific::SetForegroundWindowByWId(WId winId) 
{ 
    HWND hWnd = (HWND)winId; 
    if (hWnd) 
    { 
     ShowWindow(hWnd, SW_SHOWNORMAL); 

     WINDOWINFO wi; 
    GetWindowInfo(hWnd, &wi); 
    bool bTopMost = ((wi.dwExStyle & WS_EX_TOPMOST) == WS_EX_TOPMOST); 

    SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE); 

    if (!bTopMost) 
    { 
     SetWindowPos(hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE); 
    } 

    SetForegroundWindow(hWnd); 

    return true; 
    } 

    return false; 
    } 
2

いいえ、isRunning()は、プログラムが既に別のインスタンスを実行していることを示しています。このインスタンスはもう一度終了する必要があります。

実行中のインスタンスにメッセージを送信する必要があります。そのメッセージは自分自身に転送する必要があります。

を参照してくださいhttps://github.com/qtproject/qt-solutions/blob/master/qtsingleapplication/examples/loader/main.cpp

+0

ご回答ありがとうございます。しかし、それは動作しません。私はQWidgtの代わりにQMLを使用しているからです。他のウィンドウの前でアプリケーションをアクティブにできないように、activeWindowsを設定できません。 – Allen

+0

アクティベーションウィンドウヘルパーメソッドを使用することはできませんが、メッセージに反応してウィンドウをアクティブにすることはできます。 'QWindow :: requestActivate()'など –

関連する問題