关于“永远在线”的问题有很多信息,但我没有经验可以通过。 我想在我的窗口(这是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'
是因为我的窗口是一个对话框(不是主窗口)?我该如何解决?
答案 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会导致窗口隐藏。