属性错误PyQt4没有属性' setFrameShape'

时间:2017-11-01 08:56:09

标签: python qt pyqt4 attributeerror

您好我的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))

非常感谢有人帮助我, 贾斯特斯

2 个答案:

答案 0 :(得分:0)

根据其他答案here,我说你试图将QFrame设计推入QMainWindow。此外,"示例" class继承自QMainWindow,但QWidget构造函数是一个被调用的,这很奇怪。

答案 1 :(得分:0)

如果要使用Qt Designer工具创建设计,请在对话框中使用以下内容。

enter image description here

在此对话框中,您可以选择2个块的元素:

  • 模板/表格
  • 窗口小部件

在这两种情况下,它提供的是设计不是小部件,所以如果我们想要使用它,这可以通过小部件实现,但小部件取决于它的初始选择我们必须考虑以下因素:

  1. 如果我选择一些模板/表格,则必须根据下表选择小部件。
  2. +-----------------------------+--------------+
    | Template                    | Widget Class |
    +-----------------------------+--------------+
    | Dialog with Buttons Bottom  | QDialog      |  
    | Dialog with Buttons Right   | QDialog      |
    | Dialog without Buttons      | QDialog      |
    | MainWindow                  | QMainWindow  |
    | Widget                      | QWidget      | 
    +-----------------------------+--------------+
    
    1. 相反,如果您选择第二个块的设计,则必须使用在那里命名的小部件。
    2. 在您的情况下,我认为您已选择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)

      因此,如果您使用其他窗口小部件,它将不会使用这些方法并生成您​​已获得的错误。