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

Atribute Error PyQt4 no attribute 'setFrameShape'

您好,我对 PyQt4 有疑问。

我在 Qt 设计器中创建了一个简单的项目,但我不能 运行。 我尝试了一些代码并进行了很多更改,但每次都出现相同的错误: AttributeError: 'MyApp' 对象没有属性 'setFrameShape'

这就是我从 .ui:

转换为 运行 .py 代码的代码
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))

如果有人能帮助我,谢谢 贾斯图斯

根据其他答案,我会说您正试图将 QFrame 设计推入 QMainWindow。另外,"Example" class 继承自 QMainWindow 但调用的是 QWidget 构造函数,这很奇怪。

当您想使用 Qt Designer 工具创建设计时,请在对话框中使用以下命令。

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

  • Templates/Forms
  • 小部件

在这两种情况下,它提供的是设计而不是小部件,所以最后如果我们想使用它,这将可以通过小部件来实现,但是小部件取决于它的初始选择,我们必须有以下注意事项:

  1. 如果我选择一些Template / Forms,那么你必须根据以下table选择widget。

+-----------------------------+--------------+
| Template                    | Widget Class |
+-----------------------------+--------------+
| Dialog with Buttons Bottom  | QDialog      |  
| Dialog with Buttons Right   | QDialog      |
| Dialog without Buttons      | QDialog      |
| MainWindow                  | QMainWindow  |
| Widget                      | QWidget      | 
+-----------------------------+--------------+

  1. 相反,如果您选择第二个块的设计,则必须使用在那里命名的小部件。

在您的情况下,我认为您选择了 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()

注:

  • 如果你要继承一些 class 你必须调用那个 class 的构造函数,例如在你的初始代码中你继承自 QMainWindow 但你正在调用 QWidget 构造函数。可能会产生问题,因为构造函数执行某些基本任务来配置,因此如果您不调用它,您可能会出现意外行为。

  • 要获得您通过 Qt Designer 配置的行为,当您将其转换为 .py 时,这会调用某些方法,例如在您的情况下:

Frame.setFrameShape(QtGui.QFrame.StyledPanel) Frame.setFrameShadow(QtGui.QFrame.Raised)

所以如果你使用另一个小部件,它不会有这些方法并产生你得到的错误。