pyqt5始终处于顶部单选按钮不工作



我用pyqt5 python制作了Always on top单选按钮。

但没有工作,也没有错误。怎么了?

单击单选按钮时,将字符串("ON"或"OFF"(传递给功能

def radioButtonClicked_always作为字符串执行始终在顶部的代码

"ON"=始终在顶部执行"OFF"=始终处于顶部禁用

我添加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_())

您正在为子窗口小部件"Button"设置窗口标志(顺便说一句,我建议您使用另一个名称(,而您必须为窗口设置它。

此外,正如关于windowFlags的文档所报告的那样:

注意:此函数在更改窗口的标志时调用setParent((,导致小部件隐藏。必须调用show((才能使小部件再次可见。。

因此,您必须为小部件的顶级窗口(可通过QWidget.window()访问(设置标志,然后立即调用窗口的show((方法。


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


请注意,您不应该使用小部件的标签进行比较。对于类似的情况,请使用QButtonGroup:您可以为添加的每个按钮设置一个ID,并使用该ID来标识切换了哪个按钮。

考虑到buttonToggled信号也是在按钮未选中时发送的,因此您必须检查已选中状态和按钮Id,并且在您的情况下,仅当已选中状态为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()

最新更新