PyQt:无法访问继承的verticalLayout - “对象没有属性”

时间:2018-02-01 01:06:36

标签: python qt pyqt pyqt4 qt-designer

我在Qt Designer中创建了一个名为Ui_Dashboard的MainWindow设计。我还创建了一个名为“units_table”的小部件,我想在Ui_Dashboard中导入和显示它。

我创建了一个新类并继承了Ui_Dashboard类,但由于某种原因无法访问verticalLayout对象。请参阅以下代码:

dashboard.py

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'dashboard.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_Dashboard(object):
    def setupUi(self, Dashboard):
        Dashboard.setObjectName(_fromUtf8("Dashboard"))
        Dashboard.resize(800, 600)
        self.centralwidget = QtGui.QWidget(Dashboard)
        self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
        self.widget = QtGui.QWidget(self.centralwidget)
        self.widget.setGeometry(QtCore.QRect(50, 21, 683, 360))
        self.widget.setObjectName(_fromUtf8("widget"))
        self.verticalLayout = QtGui.QVBoxLayout(self.widget)
        self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
        self.horizontalLayout = QtGui.QHBoxLayout()
        self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
        self.units_button = QtGui.QPushButton(self.widget)
        self.units_button.setCheckable(True)
        self.units_button.setChecked(False)
        self.units_button.setObjectName(_fromUtf8("units_button"))
        self.horizontalLayout.addWidget(self.units_button)
        self.calls_button = QtGui.QPushButton(self.widget)
        self.calls_button.setCheckable(True)
        self.calls_button.setObjectName(_fromUtf8("calls_button"))
        self.horizontalLayout.addWidget(self.calls_button)
        self.vehicles_button = QtGui.QPushButton(self.widget)
        self.vehicles_button.setCheckable(True)
        self.vehicles_button.setObjectName(_fromUtf8("vehicles_button"))
        self.horizontalLayout.addWidget(self.vehicles_button)
        self.persons_button = QtGui.QPushButton(self.widget)
        self.persons_button.setCheckable(True)
        self.persons_button.setObjectName(_fromUtf8("persons_button"))
        self.horizontalLayout.addWidget(self.persons_button)
        self.pushButton_6 = QtGui.QPushButton(self.widget)
        self.pushButton_6.setCheckable(True)
        self.pushButton_6.setObjectName(_fromUtf8("pushButton_6"))
        self.horizontalLayout.addWidget(self.pushButton_6)
        self.pushButton_4 = QtGui.QPushButton(self.widget)
        self.pushButton_4.setCheckable(True)
        self.pushButton_4.setObjectName(_fromUtf8("pushButton_4"))
        self.horizontalLayout.addWidget(self.pushButton_4)
        self.pushButton_5 = QtGui.QPushButton(self.widget)
        self.pushButton_5.setCheckable(True)
        self.pushButton_5.setObjectName(_fromUtf8("pushButton_5"))
        self.horizontalLayout.addWidget(self.pushButton_5)
        self.verticalLayout.addLayout(self.horizontalLayout)
        self.inserted_module = QtGui.QWidget(self.widget)
        self.inserted_module.setMinimumSize(QtCore.QSize(481, 321))
        self.inserted_module.setObjectName(_fromUtf8("inserted_module"))
        self.verticalLayout.addWidget(self.inserted_module)
        Dashboard.setCentralWidget(self.centralwidget)
        self.menubar = QtGui.QMenuBar(Dashboard)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 23))
        self.menubar.setObjectName(_fromUtf8("menubar"))
        Dashboard.setMenuBar(self.menubar)
        self.statusbar = QtGui.QStatusBar(Dashboard)
        self.statusbar.setObjectName(_fromUtf8("statusbar"))
        Dashboard.setStatusBar(self.statusbar)

        self.retranslateUi(Dashboard)
        QtCore.QMetaObject.connectSlotsByName(Dashboard)

    def retranslateUi(self, Dashboard):
        Dashboard.setWindowTitle(_translate("Dashboard", "MainWindow", None))
        self.units_button.setText(_translate("Dashboard", "Units", None))
        self.calls_button.setText(_translate("Dashboard", "Calls", None))
        self.vehicles_button.setText(_translate("Dashboard", "Vehicles", None))
        self.persons_button.setText(_translate("Dashboard", "Persons", None))
        self.pushButton_6.setText(_translate("Dashboard", "PushButton", None))
        self.pushButton_4.setText(_translate("Dashboard", "PushButton", None))
        self.pushButton_5.setText(_translate("Dashboard", "PushButton", None))

main.py

import sys

from PyQt4 import QtCore, QtGui, uic
from dashboard import Ui_Dashboard


class MainWindow(QtGui.QMainWindow, Ui_Dashboard):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.units_table = uic.loadUi('units_table.ui', self)
        self.inserted_module = self.units_table
        self.inserted_module.setMinimumSize(QtCore.QSize(481, 321))
        self.verticalLayout.addWidget(self.inserted_module)
        self.setupUi(self)


if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    window = MainWindow()
    window.show()
    app.exec_()

我能够完美地显示导入的小部件,但是我需要将它作为孩子添加到垂直布局中,这是我遇到困难的地方。尽管Ui_Dashboard被继承,但我仍然无法访问verticalLayout。

我一直收到以下错误:

  

AttributeError:'MainWindow'对象没有属性'verticalLayout'

1 个答案:

答案 0 :(得分:0)

verticalLayout不存在,因为它是在setupUi()方法中创建的,您必须要做的是在您想要使用它之前加载它。另一个错误是你不应该将self传递给loadUi(),因为你要做的是重新实现小部件的设计:

import sys

from PyQt4 import QtCore, QtGui, uic
from dashboard import Ui_Dashboard


class MainWindow(QtGui.QMainWindow, Ui_Dashboard):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setupUi(self)
        self.units_table = uic.loadUi('units_table.ui')
        self.verticalLayout.addWidget(self.units_table )


if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())