您好我的PyQt4有问题。
我在Qt Designer中创建了一个简单的Project,但我无法运行它。 我尝试了一些改变很多的代码,但每次都得到相同的错误: AttributeError:' MyApp'对象没有属性' setFrameShape'
这就是我运行.py代码的代码,我是从.ui转换而来的。
import sys
from PyQt4 import QtGui
from qt_test import Ui_Frame
class Example(QtGui.QMainWindow):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.ui = Ui_Frame()
self.ui.setupUi(self)
def main():
app = QtGui.QApplication(sys.argv)
form = Example()
form.show()
sys.exit(app.exec_())
main()
这是来自qt_test.py的代码,我从.ui文件转换而来:
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'qt_test.ui'
#
# Created by: PyQt4 UI code generator 4.11.4
#
# WARNING! All changes made in this file will be lost!
from PyQt4 import QtCore, QtGui
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
def _fromUtf8(s):
return s
try:
_encoding = QtGui.QApplication.UnicodeUTF8
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig)
class Ui_Frame(object):
def setupUi(self, Frame):
Frame.setObjectName(_fromUtf8("Frame"))
Frame.resize(493, 451)
Frame.setFrameShape(QtGui.QFrame.StyledPanel)
Frame.setFrameShadow(QtGui.QFrame.Raised)
self.verticalLayout = QtGui.QVBoxLayout(Frame)
self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
self.listWidget = QtGui.QListWidget(Frame)
self.listWidget.setObjectName(_fromUtf8("listWidget"))
self.verticalLayout.addWidget(self.listWidget)
self.pushButton = QtGui.QPushButton(Frame)
self.pushButton.setObjectName(_fromUtf8("pushButton"))
self.verticalLayout.addWidget(self.pushButton)
self.retranslateUi(Frame)
QtCore.QMetaObject.connectSlotsByName(Frame)
def retranslateUi(self, Frame):
Frame.setWindowTitle(_translate("Frame", "Frame", None))
self.pushButton.setText(_translate("Frame", "PushButton", None))
非常感谢有人帮助我, 贾斯特斯
答案 0 :(得分:0)
根据其他答案here,我说你试图将QFrame设计推入QMainWindow。此外,"示例" class继承自QMainWindow,但QWidget构造函数是一个被调用的,这很奇怪。
答案 1 :(得分:0)
如果要使用Qt Designer工具创建设计,请在对话框中使用以下内容。
在此对话框中,您可以选择2个块的元素:
在这两种情况下,它提供的是设计不是小部件,所以如果我们想要使用它,这可以通过小部件实现,但小部件取决于它的初始选择我们必须考虑以下因素:
+-----------------------------+--------------+
| Template | Widget Class |
+-----------------------------+--------------+
| Dialog with Buttons Bottom | QDialog |
| Dialog with Buttons Right | QDialog |
| Dialog without Buttons | QDialog |
| MainWindow | QMainWindow |
| Widget | QWidget |
+-----------------------------+--------------+
在您的情况下,我认为您已选择QFrame
作为设计,因此您应该使用该小部件,如下所示:
import sys
from PyQt4 import QtGui
from qt_test import Ui_Frame
class Example(QtGui.QFrame):
def __init__(self, parent=None):
QtGui.QFrame.__init__(self, parent)
self.ui = Ui_Frame()
self.ui.setupUi(self)
def main():
app = QtGui.QApplication(sys.argv)
form = Example()
form.show()
sys.exit(app.exec_())
main()
注意:的
如果要从某个类继承,则必须调用该类的构造函数,例如在您从QMainWindow
继承的初始代码中,但是您正在调用QWidget
构造函数。可能会生成此问题,因为构造函数执行某些基本任务来配置,因此如果您不调用它,则可能会出现意外行为。
要获取通过Qt Designer配置的行为,当您将其转换为.py时会调用某些方法,例如在您的情况下:
Frame.setFrameShape(QtGui.QFrame.StyledPanel)
Frame.setFrameShadow(QtGui.QFrame.Raised)
因此,如果您使用其他窗口小部件,它将不会使用这些方法并生成您已获得的错误。