2013-07-01 2 views
10

QWebView 유형의 새 창을 여는 QAction이있는 QSystemTrayIcon이 있습니다. 창에 포커스가 사라지고 QAction을 다시 선택하면 창에 포커스가 다시 있어야합니다. 그것은 Linux에서하지만 Mac OS X에서는 발생하지 않습니다. 문제는 다른 창을 열고 활성화 할 때 Google 크롬을 열고 창에서 show()를 호출하면 항상 Google 크롬에서 열리므로 본 적이 없습니다. QWebView가 여러 창을 열었을 때 초점을 맞추기 위해 동일한 작업이 진행되며, QWebView가 창에 초점을 맞추기 위해 QAction을 클릭하면 항상 내 Chrome 창 아래에있게됩니다. 내 응용 프로그램 프로세스의 일부인 QAction을 클릭하면 창을 열거 나 포커스하려 시도하지만, 작업 중간에 QSystemTrayIcon부터 Google 크롬 창이 일정을 잡고 포커스를 얻습니다. 초점을 잡을 수 없습니다. 그렇기 때문에 창이 열리거나 집중하면 운영체제에서 허용하지 않으므로 Chrome에서 포커스를 훔치지 않으므로 현재 포커스가 설정된 창 아래에 배치됩니다.Mac OS X의 QWidget이 Qt 5.x에 초점을 맞추지 않았습니다.

// ... 
QPointer<QWebView> view; 
// ... 

void TrayIcon::webView() { 
    if (!this->view) { 
    this->view = new QWebView(); 
    this->view->load("http://example.com"); 
    this->view->show(); 
    } else { 
    this->view->activateWindow(); 
    this->view->raise(); 
    } 
} 

내가 잘못 할 또는 알려진 해결 방법이있는 것이 있습니다 : 여기에 내가 생성/방법

창을 집중?

약간 논외

답변

6

그래서 플랫폼 종속 코드로 문제를 해결했습니다. .mm 파일에 코드가있는 Focuser 클래스를 만들었습니다.이 클래스에는 Cocoa라는 Objective-C 코드가 들어 있습니다.

focuser.cpp

#ifndef FOCUSER_H 
#define FOCUSER_H 

#include <QWidget> 

class Focuser { 
    QWidget *widget; 
public: 
    Focuser(QWidget *); 
    void show(); 
    void focus(); 
}; 

#endif // FOCUSER_H 

focuser_mac.mm

#include "focuser.h" 
#import <Cocoa/Cocoa.h> 

Focuser::Focuser(QWidget *w) { 
    this->widget = w; 
} 

void Focuser::show() { 
    this->widget->show(); 
    this->focus(); 
} 

void Focuser::focus() { 
    [NSApp activateIgnoringOtherApps:YES]; 
    this->widget->activateWindow(); 
    this->widget->raise(); 
} 

focuser.h

#include "focuser.h" 

Focuser::Focuser(QWidget *w) { 
    this->widget = w; 
} 

void Focuser::show() { 
    this->widget->show(); 
    this->focus(); 
} 

void Focuser::focus() { 
    this->widget->activateWindow(); 
    this->widget->raise(); 
} 

그래서 우리는있어 생성자는 QWidget을 받아이있다 하나 개의 클래스 공개 메소드, 위젯을 집중적으로 보여주는 위젯과 포커스를 보여주는 하나의 쇼. 그런 다음 우리는 클래스에 대해 두 가지 정의를 가지고 있습니다. 하나는 Mac OS X 용이고 focuser_mac.mm이고 다른 하나는 focuser.cpp 다른 운영 체제 용입니다. 맥의 하나가 추가 그것은 당신의 이를 추가해야합니다으로 컴파일하기 위해서는 지금

[NSApp activateIgnoringOtherApps:YES]; 

를 호출합니다.프로
파일 :

우리가 완료
HEADERS += focuser.h 

mac { 
    OBJECTIVE_SOURCES += focuser_mac.mm 
} 

linux|win32 { 
    SOURCES += focuser.cpp 
} 

, 당신이 집중해야하는 응용 프로그램을 필요로이 코드를 추가

QWidget *w = new QWidget(); 
// ... 
Focuser f(w); 
w.show(); // The widget will now be shown and focused by default. 
6

하지만 일부 사용자를 위해 유용 할 수있다 :

내 제안은 윈도우의 모금을 강제로 플랫폼에 의존하는 코드를 작성하는 것입니다. 이 Windows 플랫폼에서 동일한 문제가있다, 그래서 나는 다음 해킹을 사용하고 있습니다 :

void Utils::forceForegroundWindow(WId winId) 
    { 
#ifdef Q_OS_WIN 
     HWND hWnd = winId; 

     if (::IsWindow(hWnd)) 
     { 
      HWND hCurrWnd; 
      int iMyTID; 
      int iCurrTID; 

      hCurrWnd = ::GetForegroundWindow(); 
      iMyTID = ::GetCurrentThreadId(); 
      iCurrTID = ::GetWindowThreadProcessId(hCurrWnd, 0); 

      ::AttachThreadInput(iMyTID, iCurrTID, TRUE); 

      ::ShowWindow(hWnd, SW_SHOWNORMAL); 
      ::SetForegroundWindow(hWnd); 

      ::AttachThreadInput(iMyTID, iCurrTID, FALSE); 
     } 

#endif 
    } 

나는 여전히 내 프로젝트에 맥 OS 호환성을 제공하지, 그래서이 코드가 아닌 승리 플랫폼에 대한 기능이 없습니다.

또 다른 아이디어 : 항상 눈에 잘 띄는 창을 유지해야합니다. WA_TranslucentBackground로 작업 해보십시오. WA_TransparentForMouseEvents 속성 + FramelessWindowHint 플래그입니다. 따라서 응용 프로그램에는 결코 집중할 수 없습니다.

+0

불행하게도, 창 (10)이없는 작품 –