通过复选框PyQt始终处于最佳行为

时间:2016-02-19 11:10:08

标签: python pyqt4 flags

关于“永远在线”的问题有很多信息,但我没有经验可以通过。 我想在我的窗口(这是QDialog)上有一个CheckBox(aboveAll)来将窗口的行为从'normal'切换到'always on top'。我最接近的是:

from PyQt4.QtGui import *
class MyForm(QtGui.QDialog):
    def __init__(self, parent = None):
        QtGui.QWidget.__init__(self,parent)
        self.ui = Ui_Kamipy()
        self.ui.setupUi(self)
        self.ui.aboveAll.stateChanged.connect(self.ABOVE)
    def ABOVE(self):
        if self.ui.aboveAll.isChecked() == True:
            self.ui.setWindowFlags(self.ui.windowFlags() & ~QtCore.Qt.WindowStaysOnTopHint)
        if self.ui.aboveAll.isChecked() == False:
            self.ui.setWindowFlags(self.ui.windowFlags() | QtCore.Qt.WindowStaysOnTopHint)

它带来以下错误:

  

追踪(最近一次通话):     文件“kamimimi.pyw”,第17行,在上面       self.ui.setWindowFlags(self.ui.windowFlags()| QtCore.Qt.WindowStaysOnTopHint)   AttributeError:'Ui_Kamipy'对象没有属性'setWindowFlags'

是因为我的窗口是一个对话框(不是主窗口)?我该如何解决?

1 个答案:

答案 0 :(得分:1)

您的窗口 是一个对话框。但你不是在调用你窗户的方法;你正在调用self.ui的方法 - 正如追溯告诉你的那样,它的类型为Ui_Kamipy,而不是QDialog

self.ui对象只是一个简单的python包装类,它为您在Qt Designer中添加的小部件提供命名空间。当您调用其setupUi方法时,您将传入您在Qt Designer中创建的顶级类的实例。因此,在这种情况下,顶级类为QDialog,您传入实例self

因此窗口为self,其子窗口小部件可以作为命名空间self.ui的属性进行访问。这意味着您的代码应该更像这样:

from PyQt4 imort QtCore, QtGui

class MyForm(QtGui.QDialog):
    def __init__(self, parent=None):
        QtGui.QDialog.__init__(self, parent)
        self.ui = Ui_Kamipy()
        self.ui.setupUi(self)
        self.ui.aboveAll.stateChanged.connect(self.ABOVE)

    def ABOVE(self):
        if self.ui.aboveAll.isChecked():
            self.setWindowFlags(
                self.windowFlags() & ~QtCore.Qt.WindowStaysOnTopHint)
        else:
            self.setWindowFlags(
                self.windowFlags() | QtCore.Qt.WindowStaysOnTopHint)
        self.show()

请注意,我在底部添加了行self.show(),因为setWindowFlags会导致窗口隐藏。