2016-02-19 45 views
2

关于“永远在上”的问题有很多信息,但我太缺乏经验。 我想在我的窗口(这是QDialog)上有一个CheckBox(aboveAll)来将窗口的行为从'normal'切换到'always on top'。最近我得到:通过复选框始终处于顶级行为PyQt

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) 

以及它所带来的以下错误:

Traceback (most recent call last): File "kamimimi.pyw", line 17, in ABOVE self.ui.setWindowFlags(self.ui.windowFlags() | QtCore.Qt.WindowStaysOnTopHint) AttributeError: 'Ui_Kamipy' object has no attribute 'setWindowFlags'

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

回答

1

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

self.ui object是一个简单的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可能导致窗口变为隐藏。

+0

现在很清楚。在发布这个问题之前,我已经写好了我的代码,但窗口消失让我觉得它完全搞砸了。非常感谢你的深刻解释!我会投票,如果我可以:-) – Oromay