pyqt5 всегда на верхней радио-кнопка не работает - PullRequest
0 голосов
/ 05 марта 2020

Я сделал Всегда сверху радио-кнопка с pyqt5 python.

Но не работает и без ошибок. В чем проблема?

При нажатии переключателя передать строку («ON» или «OFF») в fun c

def radioButtonClicked_always всегда выполняется в верхнем коде как строка

«ВКЛ» = всегда сверху выполнить «ВЫКЛ» = всегда сверху отключить

Я добавляю print("ON") для теста. Он также отлично работает.

import sys, os
from PyQt5 import QtWidgets, QtGui, QtCore
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *


class Button(QWidget):

    def __init__(self, parent):
        super(Button, self).__init__(parent)
        self.parent = parent
        self.initUI()

    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")
        rb2_1.clicked.connect((lambda state, x=rb2_1.text(): self.radioButtonClicked_always(x)))
        hbox_in.addWidget(rb2_1)

        rb2_2 = QRadioButton("OFF")
        rb2_2.clicked.connect((lambda state, x=rb2_2.text(): self.radioButtonClicked_always(x)))
        rb2_2.setChecked(True)
        hbox_in.addWidget(rb2_2)
        listBox.addLayout(hbox)

        self.setWindowTitle('Helper')
        self.setGeometry(300, 300, 300, 200)
        # self.show()

    def radioButtonClicked_always(self, s_state):
        if s_state == "ON":
            print("ON")
            self.setWindowFlags(self.windowFlags() | QtCore.Qt.WindowStaysOnTopHint)
        else:
            print("OFF")
            self.setWindowFlags(self.windowFlags() & ~QtCore.Qt.WindowStaysOnTopHint)

    def closeEvent(self, event):
        self.deleteLater()


class MyApp(QMainWindow):

    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.statusBar().showMessage('Ready')

        bt = Button(self)
        self.setCentralWidget(bt)
        self.setGeometry(300, 300, 300, 200)
        self.show()

    def closeEvent(self, event):
        self.deleteLater()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = MyApp()
    sys.exit(app.exec_())

1 Ответ

0 голосов
/ 05 марта 2020

Вы устанавливаете флаг окна для дочернего виджета «Кнопка» (кстати, я бы предложил вам использовать другое имя), в то время как вы должны установить его для окна .

Кроме того, поскольку документация о 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...