代码之家  ›  专栏  ›  技术社区  ›  Kamil Kisiel

将简单的Qt设计器窗体加载到Pyside

  •  10
  • Kamil Kisiel  · 技术社区  · 15 年前

    我在QtDesigner中创建了一个简单的表单,并试图将其加载到我用Pyside创建的Qt应用程序中,但没有太多运气。

    这是“pyside uic”生成的代码:

    # -*- coding: utf-8 -*-
    
    # Form implementation generated from reading ui file 'clientEditorForm.ui'
    #
    # Created: Tue Nov  3 23:46:41 2009
    #      by: PySide uic UI code generator
    #
    # WARNING! All changes made in this file will be lost!
    
    from PySide import QtCore, QtGui
    
    class Ui_clientEditorForm(object):
        def setupUi(self, clientEditorForm):
            clientEditorForm.setObjectName("clientEditorForm")
            clientEditorForm.resize(575, 446)
            self.horizontalLayout_3 = QtGui.QHBoxLayout(clientEditorForm)
            self.horizontalLayout_3.setObjectName("horizontalLayout_3")
            self.splitter = QtGui.QSplitter(clientEditorForm)
            self.splitter.setOrientation(QtCore.Qt.Horizontal)
            self.splitter.setObjectName("splitter")
            self.layoutWidget = QtGui.QWidget(self.splitter)
            self.layoutWidget.setObjectName("layoutWidget")
            self.verticalLayout = QtGui.QVBoxLayout(self.layoutWidget)
            self.verticalLayout.setObjectName("verticalLayout")
            self.horizontalLayout_2 = QtGui.QHBoxLayout()
            self.horizontalLayout_2.setObjectName("horizontalLayout_2")
            self.searchLabel = QtGui.QLabel(self.layoutWidget)
            self.searchLabel.setObjectName("searchLabel")
            self.horizontalLayout_2.addWidget(self.searchLabel)
            self.searchEdit = QtGui.QLineEdit(self.layoutWidget)
            self.searchEdit.setObjectName("searchEdit")
            self.horizontalLayout_2.addWidget(self.searchEdit)
            self.clearButton = QtGui.QPushButton(self.layoutWidget)
            self.clearButton.setObjectName("clearButton")
            self.horizontalLayout_2.addWidget(self.clearButton)
            self.verticalLayout.addLayout(self.horizontalLayout_2)
            self.clientListView = QtGui.QListView(self.layoutWidget)
            sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
            sizePolicy.setHorizontalStretch(0)
            sizePolicy.setVerticalStretch(0)
            sizePolicy.setHeightForWidth(self.clientListView.sizePolicy().hasHeightForWidth())
            self.clientListView.setSizePolicy(sizePolicy)
            self.clientListView.setObjectName("clientListView")
            self.verticalLayout.addWidget(self.clientListView)
            self.frame = QtGui.QFrame(self.splitter)
            self.frame.setFrameShape(QtGui.QFrame.StyledPanel)
            self.frame.setFrameShadow(QtGui.QFrame.Raised)
            self.frame.setObjectName("frame")
            self.verticalLayout_3 = QtGui.QVBoxLayout(self.frame)
            self.verticalLayout_3.setObjectName("verticalLayout_3")
            self.formLayout = QtGui.QFormLayout()
            self.formLayout.setObjectName("formLayout")
            self.nameEdit = QtGui.QLineEdit(self.frame)
            self.nameEdit.setObjectName("nameEdit")
            self.formLayout.setWidget(0, QtGui.QFormLayout.FieldRole, self.nameEdit)
            self.nameLabel = QtGui.QLabel(self.frame)
            self.nameLabel.setObjectName("nameLabel")
            self.formLayout.setWidget(0, QtGui.QFormLayout.LabelRole, self.nameLabel)
            self.profileButton = QtGui.QLabel(self.frame)
            self.profileButton.setObjectName("profileButton")
            self.formLayout.setWidget(1, QtGui.QFormLayout.LabelRole, self.profileButton)
            self.addressLabel = QtGui.QLabel(self.frame)
            self.addressLabel.setObjectName("addressLabel")
            self.formLayout.setWidget(2, QtGui.QFormLayout.LabelRole, self.addressLabel)
            self.locationLabel = QtGui.QLabel(self.frame)
            self.locationLabel.setObjectName("locationLabel")
            self.formLayout.setWidget(3, QtGui.QFormLayout.LabelRole, self.locationLabel)
            self.secureLabel = QtGui.QLabel(self.frame)
            self.secureLabel.setObjectName("secureLabel")
            self.formLayout.setWidget(4, QtGui.QFormLayout.LabelRole, self.secureLabel)
            self.UUIDLabel = QtGui.QLabel(self.frame)
            self.UUIDLabel.setObjectName("UUIDLabel")
            self.formLayout.setWidget(5, QtGui.QFormLayout.LabelRole, self.UUIDLabel)
            self.passwordLabel = QtGui.QLabel(self.frame)
            self.passwordLabel.setObjectName("passwordLabel")
            self.formLayout.setWidget(6, QtGui.QFormLayout.LabelRole, self.passwordLabel)
            self.profileComboBox = QtGui.QComboBox(self.frame)
            self.profileComboBox.setObjectName("profileComboBox")
            self.formLayout.setWidget(1, QtGui.QFormLayout.FieldRole, self.profileComboBox)
            self.addressEdit = QtGui.QLineEdit(self.frame)
            self.addressEdit.setObjectName("addressEdit")
            self.formLayout.setWidget(2, QtGui.QFormLayout.FieldRole, self.addressEdit)
            self.locationComboBox = QtGui.QComboBox(self.frame)
            self.locationComboBox.setObjectName("locationComboBox")
            self.formLayout.setWidget(3, QtGui.QFormLayout.FieldRole, self.locationComboBox)
            self.secureComboBox = QtGui.QComboBox(self.frame)
            self.secureComboBox.setObjectName("secureComboBox")
            self.formLayout.setWidget(4, QtGui.QFormLayout.FieldRole, self.secureComboBox)
            self.UUIDEdit = QtGui.QLineEdit(self.frame)
            self.UUIDEdit.setObjectName("UUIDEdit")
            self.formLayout.setWidget(5, QtGui.QFormLayout.FieldRole, self.UUIDEdit)
            self.passwordEdit = QtGui.QLineEdit(self.frame)
            self.passwordEdit.setObjectName("passwordEdit")
            self.formLayout.setWidget(6, QtGui.QFormLayout.FieldRole, self.passwordEdit)
            self.verticalLayout_3.addLayout(self.formLayout)
            self.aliasesGroupBox = QtGui.QGroupBox(self.frame)
            self.aliasesGroupBox.setFlat(False)
            self.aliasesGroupBox.setCheckable(False)
            self.aliasesGroupBox.setObjectName("aliasesGroupBox")
            self.verticalLayout_2 = QtGui.QVBoxLayout(self.aliasesGroupBox)
            self.verticalLayout_2.setObjectName("verticalLayout_2")
            self.aliasesListView = QtGui.QListView(self.aliasesGroupBox)
            self.aliasesListView.setObjectName("aliasesListView")
            self.verticalLayout_2.addWidget(self.aliasesListView)
            self.horizontalLayout_4 = QtGui.QHBoxLayout()
            self.horizontalLayout_4.setObjectName("horizontalLayout_4")
            spacerItem = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
            self.horizontalLayout_4.addItem(spacerItem)
            self.addButton = QtGui.QPushButton(self.aliasesGroupBox)
            self.addButton.setObjectName("addButton")
            self.horizontalLayout_4.addWidget(self.addButton)
            self.removeButton = QtGui.QPushButton(self.aliasesGroupBox)
            self.removeButton.setObjectName("removeButton")
            self.horizontalLayout_4.addWidget(self.removeButton)
            self.verticalLayout_2.addLayout(self.horizontalLayout_4)
            self.verticalLayout_3.addWidget(self.aliasesGroupBox)
            spacerItem1 = QtGui.QSpacerItem(20, 38, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
            self.verticalLayout_3.addItem(spacerItem1)
            self.horizontalLayout = QtGui.QHBoxLayout()
            self.horizontalLayout.setObjectName("horizontalLayout")
            spacerItem2 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
            self.horizontalLayout.addItem(spacerItem2)
            self.revertButton = QtGui.QPushButton(self.frame)
            self.revertButton.setObjectName("revertButton")
            self.horizontalLayout.addWidget(self.revertButton)
            self.applyButton = QtGui.QPushButton(self.frame)
            self.applyButton.setObjectName("applyButton")
            self.horizontalLayout.addWidget(self.applyButton)
            self.verticalLayout_3.addLayout(self.horizontalLayout)
            self.horizontalLayout_3.addWidget(self.splitter)
            self.searchLabel.setBuddy(self.searchEdit)
            self.nameLabel.setBuddy(self.nameEdit)
            self.profileButton.setBuddy(self.profileComboBox)
            self.addressLabel.setBuddy(self.addressEdit)
            self.locationLabel.setBuddy(self.locationComboBox)
            self.secureLabel.setBuddy(self.secureComboBox)
            self.UUIDLabel.setBuddy(self.UUIDEdit)
            self.passwordLabel.setBuddy(self.passwordEdit)
    
            self.retranslateUi(clientEditorForm)
            QtCore.QMetaObject.connectSlotsByName(clientEditorForm)
    
        def retranslateUi(self, clientEditorForm):
            clientEditorForm.setWindowTitle(QtGui.QApplication.translate("clientEditorForm", "Form", None, QtGui.QApplication.UnicodeUTF8))
            self.searchLabel.setText(QtGui.QApplication.translate("clientEditorForm", "Search", None, QtGui.QApplication.UnicodeUTF8))
            self.clearButton.setText(QtGui.QApplication.translate("clientEditorForm", "Clear", None, QtGui.QApplication.UnicodeUTF8))
            self.nameLabel.setText(QtGui.QApplication.translate("clientEditorForm", "Name", None, QtGui.QApplication.UnicodeUTF8))
            self.profileButton.setText(QtGui.QApplication.translate("clientEditorForm", "Profile", None, QtGui.QApplication.UnicodeUTF8))
            self.addressLabel.setText(QtGui.QApplication.translate("clientEditorForm", "Address", None, QtGui.QApplication.UnicodeUTF8))
            self.locationLabel.setText(QtGui.QApplication.translate("clientEditorForm", "Location", None, QtGui.QApplication.UnicodeUTF8))
            self.secureLabel.setText(QtGui.QApplication.translate("clientEditorForm", "Secure", None, QtGui.QApplication.UnicodeUTF8))
            self.UUIDLabel.setText(QtGui.QApplication.translate("clientEditorForm", "UUID", None, QtGui.QApplication.UnicodeUTF8))
            self.passwordLabel.setText(QtGui.QApplication.translate("clientEditorForm", "Password", None, QtGui.QApplication.UnicodeUTF8))
            self.aliasesGroupBox.setTitle(QtGui.QApplication.translate("clientEditorForm", "Aliases", None, QtGui.QApplication.UnicodeUTF8))
            self.addButton.setText(QtGui.QApplication.translate("clientEditorForm", "Add", None, QtGui.QApplication.UnicodeUTF8))
            self.removeButton.setText(QtGui.QApplication.translate("clientEditorForm", "Remove", None, QtGui.QApplication.UnicodeUTF8))
            self.revertButton.setText(QtGui.QApplication.translate("clientEditorForm", "Revert", None, QtGui.QApplication.UnicodeUTF8))
            self.applyButton.setText(QtGui.QApplication.translate("clientEditorForm", "Apply", None, QtGui.QApplication.UnicodeUTF8))
    

    然后我的简单应用程序:

    import sys
    from PySide import QtCore, QtGui
    
    from clientEditorForm import Ui_clientEditorForm
    
    class MyMainWindow(QtGui.QMainWindow):
        def __init__(self, parent=None):
            super(MyMainWindow, self).__init__(parent)
            self.ui = Ui_clientEditorForm()
            self.ui.setupUi(self)
    
    if __name__ == "__main__":
        app = QtGui.QApplication(sys.argv)
        myapp = MyMainWindow()
        myapp.show()
        sys.exit(app.exec_())
    

    但是,当我尝试运行它时,我得到以下信息:

    QLayout: Attempting to add QLayout "" to QMainWindow "clientEditorForm", which already has a layout
    

    以及分割错误。我遵循的基本说明 this tutorial 但我不知道我做错了什么。

    2 回复  |  直到 13 年前
        1
  •  5
  •   Kamil Kisiel    15 年前

    结果发现Pyside中有一个带有qspaceritem类的bug。在上面的代码中注释出qspaceritem实例使其工作正常。有一个关于 PySide bugzilla .

        2
  •  4
  •   joaquin    13 年前

    首先,您使用的是Pyside(Nokia)而不是Pyqt4(Riverbank Computing),尽管它们的API几乎相同,但它们不是同一个项目。Pyside示例如下: git克隆git://gitorious.org/pyside/pyside-examples.git

    我想问题可能与你的电话有关

    super(MyMainWindow, self).__init__(parent)
    

    尝试

    QtGui.QMainWindow.__init__(self, parent)
    

    相反。

    我知道这似乎是同一件事,但我在超级使用pyqt4时遇到了类似的问题,从我所知道的来看,诺基亚的pyside也有同样的问题。它与天气有关,Python拥有父对象,或者它由底层C++对象拥有。至少试一试,用不了5秒钟!

    下面是我基于的例子,它来自于Pyside的Git回购。

    #!/usr/bin/env python
    
    #############################################################################
    ##
    ## Copyright (C) 2004-2005 Trolltech AS. All rights reserved.
    ##
    ## This file is part of the example classes of the Qt Toolkit.
    ##
    ## This file may be used under the terms of the GNU General Public
    ## License version 2.0 as published by the Free Software Foundation
    ## and appearing in the file LICENSE.GPL included in the packaging of
    ## this file.  Please review the following information to ensure GNU
    ## General Public Licensing requirements will be met:
    ## http://www.trolltech.com/products/qt/opensource.html
    ##
    ## If you are unsure which license is appropriate for your use, please
    ## review the following information:
    ## http://www.trolltech.com/products/qt/licensing.html or contact the
    ## sales department at sales@trolltech.com.
    ##
    ## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
    ## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
    ##
    #############################################################################
    
    import sys
    from PySide import QtCore, QtGui
    
    from ui_calculatorform import Ui_CalculatorForm
    
    
    class CalculatorForm(QtGui.QWidget):
        def __init__(self, parent=None):
            QtGui.QWidget.__init__(self, parent)
    
            self.ui = Ui_CalculatorForm()
    
            self.ui.setupUi(self)
    
        @QtCore.pyqtSignature("int")
        def on_inputSpinBox1_valueChanged(self, value):
            self.ui.outputWidget.setText(QtCore.QString.number(value + self.ui.inputSpinBox2.value()))
    
        @QtCore.pyqtSignature("int")
        def on_inputSpinBox2_valueChanged(self, value):
            self.ui.outputWidget.setText(QtCore.QString.number(value + self.ui.inputSpinBox1.value()))
    
    
    if __name__ == "__main__":
        app = QtGui.QApplication(sys.argv)
        calculator = CalculatorForm()
        calculator.show()
        sys.exit(app.exec_())