Вы устанавливаете флаг окна для дочернего виджета «Кнопка» (кстати, я бы предложил вам использовать другое имя), в то время как вы должны установить его для окна .
Кроме того, поскольку документация о windowFlags сообщает:
Примечание: Эта функция вызывает setParent () при изменении флагов для окна, в результате чего виджет будет скрыт. Вы должны вызвать show (), чтобы снова сделать виджет видимым ..
Итак, вы должны установить флаги для окна верхнего уровня виджета (доступно через QWidget.window()
) а также сразу после этого вызовите метод show () window .
def radioButtonClicked_always(self, s_state):
if s_state == "ON":
print("ON")
<b>self.window().setWindowFlags(self.windowFlags() | QtCore.Qt.WindowStaysOnTopHint)</b>
else:
print("OFF")
<b>self.window().setWindowFlags(self.windowFlags() & ~QtCore.Qt.WindowStaysOnTopHint)
self.window().show()</b>
Обратите внимание, что вы не должны использовать ярлык виджета для сравнения. Для подобных случаев используйте QButtonGroup вместо этого: вы можете установить идентификатор для каждой добавленной кнопки и использовать этот идентификатор для определения, какая кнопка была переключена.
Учтите, что сигнал buttonToggled
также отправляется, когда кнопка не отмечена, поэтому вам нужно будет проверить как проверенное состояние и идентификатор кнопки, и, в вашем случае, установить флажки окна только тогда, когда проверенное состояние имеет значение True.
class Button(QWidget):
# ...
def initUI(self):
listBox = QVBoxLayout(self)
self.setLayout(listBox)
listBox.addStretch(1)
hbox = QHBoxLayout()
group_box_2 = QGroupBox("Always on Top")
hbox.addWidget(group_box_2)
hbox_in = QHBoxLayout()
group_box_2.setLayout(hbox_in)
rb2_1 = QRadioButton("ON")
hbox_in.addWidget(rb2_1)
rb2_2 = QRadioButton("OFF")
rb2_2.setChecked(True)
hbox_in.addWidget(rb2_2)
listBox.addLayout(hbox)
buttonGroup = QButtonGroup(self)
buttonGroup.addButton(rb2_1, 1)
buttonGroup.addButton(rb2_2, 0)
buttonGroup.buttonToggled[int, bool].connect(self.setOnTop)
self.setWindowTitle('Helper')
self.setGeometry(300, 300, 300, 200)
def setOnTop(self, buttonId, status):
if not status:
return
if buttonId:
self.window().setWindowFlags(
self.windowFlags() | QtCore.Qt.WindowStaysOnTopHint)
else:
self.window().setWindowFlags(
self.windowFlags() & ~QtCore.Qt.WindowStaysOnTopHint)
self.window().show()