Как сделать так, чтобы главное окно приложения Qt всегда оставалось поверх других окон в ОС Windows?

Платформа - Windows 7,8,10

Я создал QApplication из QMainWindow. Я хочу, чтобы он всегда оставался поверх всех других окон.

Для этого я использовал флаги Qt ( Qt::WindowStaysOnTopHint ). Но этот флаг Qt не работает. Приложение представляет собой безрамочное приложение.

Пожалуйста, найдите ниже код конструктора моего приложения Qt.

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

Как я могу заставить этот флаг работать?

Я пробовал все варианты, предложенные несколькими членами сообщества. Мой текущий код выглядит следующим образом

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

Странный факт, что это никогда не работает на моей машине. Когда я создаю установщик или копирую необходимые файлы и запускаю их на разных машинах (Windows 7, 8, 10), я получаю свое приложение поверх всех других окон. Примечание. Я использую ОС Visual Studio Community Edition 2015 — Windows 7 Professional с пакетом обновления 1.


person sunil_rbc    schedule 21.07.2016    source источник


Ответы (5)


Следующий код, наконец, помог мне, чтобы мое окно всегда было над другими окнами.

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

Я также заблокировал опцию minimze для окна, сняв флаг Minimize. Но все же есть одна проблема. Нижняя часть окна выходит за панель задач. Мне нужно щелкнуть значок приложения, чтобы вывести нижнюю часть над панелью задач.

person sunil_rbc    schedule 28.09.2016
comment
Также я хотел бы добавить, что вам нужно включить windows.h для использования SetForegroundWindow() - person GeneCode; 13.09.2017

Чтобы окно сидело поверх всех приложений.

myApp.h

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

myApp.cpp

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

Для получения дополнительной помощи

person Ankur    schedule 21.07.2016
comment
Я попробовал ваше решение. Я пробовал и другой ответ. У меня ничего нормально не работает. Иногда я получаю окно как самое верхнее окно, а иногда нет. Есть ли способ отладить, что происходит с флагами? - person sunil_rbc; 21.07.2016

написать одну простую строку в конструкторе. (нет необходимости включать какие-либо другие заголовки)

setWindowFlag(Qt::WindowStaysOnTopHint);
person Ramesh Choudhary    schedule 29.08.2020

Видеть:

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

Используйте флаг WindowStaysOnTopHint. Из Qt-документа:

«Сообщает оконной системе, что окно должно оставаться поверх всех других окон. Обратите внимание, что в некоторых оконных менеджерах на X11 вам также необходимо передать Qt:: X11BypassWindowManagerHint, чтобы этот флаг работал правильно».

Ваша ошибка в том, что вы дважды вызывали setWindowFlags для FramelessWindowHint и WindowStaysOnTopHint соответственно. Пытаться:

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

Или вы можете использовать системный API Windows:

#include <Windows.h>
....

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

В вашем .pro файле:

win32-g++:LIBS += libUser32
win32-msvc*:LIBS += User32.lib
person mohabouje    schedule 21.07.2016
comment
Я попробовал ваше решение. Иногда это работает, а иногда нет. Я не знаю, почему это иногда не работает. - person sunil_rbc; 21.07.2016

Вы должны установить setWindowFlags после ui.setupUi(this);

person Ratzz    schedule 22.07.2016
comment
Я тоже пробовал этот вариант. Все предложения, которые я пробовал, не работают на моей машине, но прекрасно работают на других машинах. - person sunil_rbc; 25.07.2016