2016-07-21 9 views
1

Plattform - Windows 7,8,10Wie mache ich das Hauptfenster von Qt Application so, dass es immer über anderen Fenstern in Windows OS steht?

Ich habe eine QApplication von QMainWindow erstellt. Ich möchte, dass es immer oben auf allen anderen Fenstern bleibt.

Ich habe Qt-Flags (Qt :: WindowStaysOnTopHint) verwendet, um dies zu erreichen. Aber dieses Qt-Flag funktioniert nicht. Die Anwendung ist eine rahmenlose Anwendung.

Hier finden Sie den Code des Konstruktors meiner Qt App.

myApp::myApp(QWidget *parent) 
: QMainWindow(parent) 
{ 
setWindowFlags(Qt::Widget | Qt::FramelessWindowHint); 
setWindowFlags(this->windowFlags() | Qt::CustomizeWindowHint | Qt::WindowStaysOnTopHint); 
ui.setupUi(this); 
} 

Wie kann ich dieses Flag funktionieren lassen?

Ich habe alle von mehreren Mitgliedern der Gemeinschaft vorgeschlagenen Optionen ausprobiert. Mein jetziger Code ist wie folgt

Qt::WindowFlags flags = this->windowFlags(); 
this->setWindowFlags(flags | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint); 
ui.setupUi(this); 

merkwürdige Tatsache ist, dass dies nie auf meiner Maschine arbeitet. Wenn ich ein Installationsprogramm erstelle oder die erforderlichen Dateien kopiere und auf einem anderen Rechner laufe (Windows 7, 8, 10), bekomme ich meine Anwendung über alle anderen Fenster. Hinweis: ich Visual Studio Community Edition 2015 OS verwende - Windows 7 Professional Service Pack 1.

Antwort

0

Siehe auch:

http://doc.qt.io/qt-5/qt.html http://doc.qt.io/qt-5/qtwidgets-widgets-windowflags-example.html

Verwenden WindowStaysOnTopHint Flagge. Von Qt Doc:

„Informiert das Fenster-System, das das Fenster über alle anderen Fenster bleiben sollte beachten, dass auf einig Window-Manager auf X11 auch Sie Qt :: X11BypassWindowManagerHint für diese Flagge zu übergeben. Arbeit richtig. "

Ihr Fehler ist, dass Sie setWindowFlags zweimal für FramelessWindowHint und WindowStaysOnTopHint jeweils genannt. Versuchen:

Qt::WindowFlags flags = windowFlags(); 
    setWindowFlags(flags | Qt::X11BypassWindowManagerHint |  Qt::WindowStaysOnTopHint); 

Oder Sie können das Windows-System API verwenden:

#include <Windows.h> 
.... 

SetForegroundWindow((HWND)winId()); 
setWindowFlags(Qt::WindowStaysOnTopHint); 

In Ihrem .proDatei:

win32-g++:LIBS += libUser32 
win32-msvc*:LIBS += User32.lib 
+0

Ich habe Ihre Lösung versucht. Manchmal funktioniert es und manchmal nicht. Ich weiß nicht, warum es manchmal nicht funktioniert. –

0

Um ein Fenster über allen anderen Anwendungen zu machen sitzen.

MyApp.h

class myApp: public QMainWindow 
    { 
     Q_OBJECT 
     public: 
     explicit myApp(QWidget *parent = 0); 
     ~myApp(); 
    protected: 
     bool event(QEvent *event); 
     ---- 
    }; 

myApp.cav

#include <windows.h> 
#include <winuser.h>  
myApp::myApp(QWidget *parent): QMainWindow(parent) 
{ 
    setWindowFlags(Qt::FramelessWindowHint |Qt::WindowStaysOnTopHint); 
    ui.setupUi(this); 
} 
bool myApp::event(QEvent *event){ 
    switch (event->type()) 
    { 
    case QEvent::Show: 
    { 
     HWND winHWND =(HWND) winId(); 
     if(winHWND){ 
      qDebug() << endl << "Setting up associated console window ON TOP !"; 
      SetWindowPos(
         winHWND, // window handle 
         HWND_TOPMOST, // "handle to the window to precede 
         // the positioned window in the Z order 
         // OR one of the following:" 
         // HWND_BOTTOM or HWND_NOTOPMOST or HWND_TOP or HWND_TOPMOST 
         0, 0, // X, Y position of the window (in client coordinates) 
         0, 0, // cx, cy => width & height of the window in pixels 
         SWP_DRAWFRAME | SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW // The window sizing and positioning flags. 
         ); 
      // OPTIONAL ! - SET WINDOW'S "SHOW STATE" 
      ShowWindow(
         winHWND, // window handle 
         SW_NORMAL // how the window is to be shown 
         // SW_NORMAL => "Activates and displays a window. 
         // If the window is minimized or maximized, 
         // the system restores it to its original size and position. 
         // An application should specify this flag 
         // when displaying the window for the first time." 
         ); 
      qDebug() << endl << "Done."; 
     } else { 
      qDebug() << endl << "There is no console window associated with this app :("; 
     } 
     break; 
    } 
    default: 
     break; 
    } 

    return QMainWindow::event(event); 
} 

For more help

+0

Ich habe deine Lösung versucht. Ich habe die andere Antwort auch ausprobiert. Nichts funktioniert für mich richtig. Manchmal bekomme ich das Fenster als oberstes Fenster und manchmal nicht. Kann ich irgendwie debuggen, was mit den Flaggen schief läuft? –

0

Sie setWindowFlags nach ui.setupUi(this);

+0

Ich habe diese Option auch ausprobiert. Alle Vorschläge, die ich ausprobiert habe, funktionieren auf meiner Maschine nicht, funktionieren aber gut auf anderen Maschinen. –

1

Der folgende Code schließlich für mich gearbeitet einstellen müssen, um mein Fenster zu halten immer über anderen Fenstern

SetForegroundWindow((HWND)winId()); 
Qt::WindowFlags flags = this->windowFlags(); 
flags = flags & ~Qt::WindowMinimizeButtonHint; 
this->setWindowFlags(flags|Qt::FramelessWindowHint|Qt::WindowStaysOnTopHint); 
ui.setupUi(this); 

Ich habe auch Blockierte die Minimize-Option für das Fenster durch Deaktivieren des Minimize-Flags. Aber immer noch gibt es ein Problem. Der untere Teil des Fensters geht über die Taskleiste hinaus. Ich muss auf das Anwendungssymbol klicken, um den unteren Teil über die Taskleiste zu bringen.

+0

Auch ich würde hinzufügen möchten Sie müssen "windows.h" hinzufügen SetForegroundWindow() verwenden – GeneCode