qtSingleApplication 사용 요약

3256 단어 Qt
응용 프로그램을 개발할 때 항상 '하나의 실례만 실행할 수 있다' 는 수요가 있다.QtSolution에서는 프로그램의 단일 실행을 위한 qtsingleapplication과 qtsignlecoreapplication을 제공합니다.
다음은 하나의 창 응용을 예로 삼아 qtsignleapplication의 사용 소감을 논술한다.
단일 실행을 고려하지 않고main 함수는 대체로 이런 구조이다
#include 
#include "FrmMain.h"     //    , QMainWindow     QWidget   
int main(int argc, char** argv)

{
    QApplication app(argc, argv);
    //             
    FrmMain frm;
    frm.show();
    return app.exec();

}

만약 qtsingleapplication을 사용하여 단일 실행을 실현한다면 코드는 조금만 수정할 수 있습니다
#include 
#include "FrmMain.h"
int main(int argc, char** argv)
{
    const QString APP_ID("app id");   //         ,          。     ,   qApp->applicationFilePath()    
    QtSingleApplicion app(APP_ID, argc, argv);
    if(app.isRunning()) {
    //          
    return -1;
    }
    FrmMain frm;
    frm.show();
    return app.exec();
}

이것은 가장 기본적인 사용이다. 바로 APP 를 사용한다.ID는 이 프로그램을 표시합니다. 실행할 때 실례가 실행 중인지 판단하고, 없으면 종료하고, 없으면 메인 창의 초기화와 현실을 실행하고 이벤트 순환에 들어갑니다.
소감1:
단일 실행은 일반적으로 두 가지 요구가 있는데 하나는 본 컴퓨터에서 이 프로그램은 최대 하나의 실례만 실행할 수 있고 하나는 본 컴퓨터에서 이exe 파일에 대응하는 프로그램은 하나의 실례만 실행할 수 있지만 다른 위치에 이exe의 실례가 있다면 다른 이exe 실례도 실행할 수 있다.만약 전자가 필요하다면, 이 프로그램의 복사본이 얼마나 많든지 간에, 최대 한 개의 실례만 실행할 수 있도록 고정된 문자열을 표시합니다.만약 2가 필요하다면 exe에 대응하는 경로를 APP 로 사용합니다ID.
단일 실행을 위한 논리는 APPID, 임시 디렉토리에 APPID의 파일입니다.실례를 열고 대응하는 파일을 삭제하면 다시 실례를 열 수 있습니다.
특히 설명이 필요한 것은, 만약 linux에서 개발된다면, 랜 내 원격 컴퓨터의 실행과 관련된 이 프로그램은 고정 문자열을 사용하든 파일 경로를 사용하든 APP 로 사용하든 상관없다.ID를 태그로 지정하면 로컬 컴퓨터와 원격 컴퓨터가 동시에 하나의 실례만 실행할 수 있습니다.그러나 때로는 수요가 이렇지 않고 하나의 단말기에서 하나의 실례가 실행될 수 있다. 그러면 이때 APPID 매개 변수와 원격 액세스를 위한 컴퓨터 IP 정보
소감2:
위의 예는 간단하고 난폭하게 처리되며, 실행 중인 실례가 존재하면 종료합니다.실제 응용에서 실행해야 하는 것은 실행 중인 실례가 있으면 알림을 주거나 실행 중인 실례의 창을 직접 보여주는 것이다.
QtSingle Application은 public slots: bool send Message(const QString & message, int timeout = 5000)를 제공합니다.신호void 메시지Received(const QString & 메시지)
그렇다면 논리는 이렇다.
a. 실례가 실행 중인지 판단하려면 c. 메인 창에 슬롯 함수가QtSingle Application의 메시지 Received 신호와 연결되어 있고 프로그램이 실행될 때 이미 실례가 실행된 것을 발견하면 메시지를 발동하고 실행된 실례가 정보를 받으면 메시지 Received 신호를 보내서 메인 창의 슬롯 함수를 실행합니다.
내가 구체적으로 사용할 때 프로그램이 실행하는 경로를 정보 전달으로 한다. 그러면 메인 창의 홈 함수는 이 경로 매개 변수에 대해 판단하고 자신이 있는 실례의 경로와 일치하는지 판단할 수 있다. 일치하면 메인 창의 앞부분에 나타난다. 그렇지 않으면 일치하지 않는다. 이것은 다른 경로 아래의 실행 프로그램임을 설명하고 힌트 정보를 제시한다.
또한 메인 창에 대응하는 슬롯 함수가 간단한 show ()라면 메인 창의 체질이 활성화되어 표시되지만 맨 앞에 나타나지 않을 수도 있습니다.나는 보통 메인 창의 윈도우즈 flag 속성을 임시로 변경하고, 맨 앞에 있는 flag를 추가한 다음, 표시하고, 맨 앞에 있는 flag를 취소한 다음 표시한다.이렇게 하면 창이 맨 앞에 표시되는 것을 보장할 수 있다.특히 맨 앞에 표시된 flag을 취소한 후 show를 실행해야 합니다. 그렇지 않으면 창이 숨겨져 보이지 않습니다.코드의 예는 다음과 같습니다.
void FrmMain::sltMessageReceived(const QString &msg)
{
    Qt::WindowFlags flags = windowFlags();
    flags |= Qt::WindowStaysOnTopHint;
    setWindowFlags(flags);
    show();
    flags &= ~Qt::WindowStaysOnTopHint;
    setWindowFlags(flags);
    showNormal();
    if(msg != qApp->applicationFilePath()) {
        const QString& warnStr(tr("Only on instance is allowed. Close running application first."));
        QMessageBox::warning(this, tr("Warn"), warnStr, QMessageBox::Ok);
    }
}

좋은 웹페이지 즐겨찾기