openbox manager guide gui archwiki arch c++ qt window-managers

c++ - manager - i3 wm archlinux



¿Cómo alterno ''siempre en la parte superior'' para QMainWindow en Qt sin causar un parpadeo o un flash? (3)

void MainWindow::on_actionAlways_on_Top_triggered(bool checked) { Qt::WindowFlags flags = this->windowFlags(); if (checked) { this->setWindowFlags(flags | Qt::CustomizeWindowHint | Qt::WindowStaysOnTopHint); this->show(); } else { this->setWindowFlags(flags ^ (Qt::CustomizeWindowHint | Qt::WindowStaysOnTopHint)); this->show(); } }

La solución anterior funciona, pero debido a que setWindowFlags oculta la ventana, es necesario volver a mostrarla y, por supuesto, no se ve muy elegante. Entonces, ¿cómo puedo alternar "siempre en la parte superior" para un QMainWindow sin ese efecto secundario "intermitente"?


Bueno, para una solución que pensé que buscaría en las fuentes Mono, ya que sé que la clase .NET Form (System.Windows.Forms) tiene una propiedad TopMost.

La solución que encontré para mi programa Qt fue:

void MainWindow::on_actionAlways_on_Top_triggered(bool checked) { #ifdef Q_OS_WIN // #include <windows.h> if (checked) { SetWindowPos(this->winId(), HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); } else { SetWindowPos(this->winId(), HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); } #else Qt::WindowFlags flags = this->windowFlags(); if (checked) { this->setWindowFlags(flags | Qt::CustomizeWindowHint | Qt::WindowStaysOnTopHint); this->show(); } else { this->setWindowFlags(flags ^ (Qt::CustomizeWindowHint | Qt::WindowStaysOnTopHint)); this->show(); } #endif }


Nokia dice que no :

No es posible realizar cambios en los indicadores de ventana una vez que se ha creado la ventana sin causar parpadeo. El parpadeo es inevitable ya que la ventana necesita ser recreada.

Pero a veces, si estás atrapado con un efecto de destello que es feo como este, puedes arrastrarlo intencionalmente para que parezca que algo "genial" acaba de suceder.

Tal vez aparezca una pequeña barra de progreso que no está en la ventana, diga "Ajuste de las propiedades de la ventana!" ... elimine la ventana de la existencia y vuelva a entrar, y cierre la ventana emergente de la barra de progreso.


Probado con

  • Qt 5.2.1 en Windows XP
  • Qt 5.2 en OS X 10.9

void ConsoleUI::onAllwaysTop(bool checked) { Qt::WindowFlags flags = windowFlags(); if (checked) { flags ^= Qt::WindowStaysOnBottomHint; flags |= Qt::WindowStaysOnTopHint; } else { flags ^= Qt::WindowStaysOnTopHint; flags |= Qt::WindowStaysOnBottomHint; } setWindowFlags(flags); show(); }