Как переключить подсказку window stay on top

#python #pyqt #window #pyqt5 #flags

#python #pyqt #окно #pyqt5 #флаги

Вопрос:

Я пытаюсь создать виджет, который пользователь должен иметь возможность выбирать, если он остается сверху. Ниже приведен пример кода того, чего я пытаюсь достичь. Попытка установить Qt.WindowStaysOnTopHint после создания виджета не работает:

 from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt

app = QApplication([])
win = QWidget()

def toggleTop():
    win.setWindowFlags(Qt.WindowStaysOnTopHint)
    win.show()

button = QPushButton('Top', win)
button.clicked.connect(toggleTop)
win.show()
app.exec_()
  

Однако, если я установлю флаг во время создания виджета, он будет работать отлично:

 from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt

app = QApplication([])
win = QWidget()
win.setWindowFlags(Qt.WindowStaysOnTopHint)
win.show()
app.exec_()
  

ОС — Ubuntu 18.04.

Ответ №1:

В настоящее время ваша toggleTop функция перезаписывает все флаги окна одним и тем же флагом каждый раз. Чтобы переключить флаг одного окна, вам необходимо явно сбросить его на основе текущего состояния флага:

 def toggleTop():
    # get the current state of the flag
    on = bool(win.windowFlags() amp; Qt.WindowStaysOnTopHint)
    # toggle the state of the flag
    win.setWindowFlag(Qt.WindowStaysOnTopHint, not on)
    win.show()
  

Комментарии:

1. win.setWindowFlags(win.windowFlags() ^ Qt.WindowStaysOnTopHint) достаточно. on = ... Строка не нужна.