【问题标题】:Python 3: QString on PyQt4Python 3:PyQt4 上的 QString
【发布时间】:2012-04-14 02:22:28
【问题描述】:

我在尝试做一个非常简单的用户界面时遇到了问题。我用 Qt Designer 制作了我的 UI,然后用 pyuic4 我得到了我的 python 代码。然后我编写了我需要的函数,并用 Eclipse IDE 编译。

我从pyuic4得到的代码是:

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

# Form implementation generated from reading ui file 'Dni.ui'
#
# Created: Sat Apr 14 02:44:34 2012
#      by: PyQt4 UI code generator 4.9.1
#
# WARNING! All changes made in this file will be lost!
from PyQt4 import QtCore, QtGui
try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    _fromUtf8 = lambda s: s

class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName(_fromUtf8("Dialog"))
        Dialog.resize(371, 217)
        Dialog.setMinimumSize(QtCore.QSize(371, 217))
        self.layoutWidget = QtGui.QWidget(Dialog)
        self.layoutWidget.setGeometry(QtCore.QRect(30, 30, 311, 151))
        self.layoutWidget.setObjectName(_fromUtf8("layoutWidget"))
        self.gridLayout = QtGui.QGridLayout(self.layoutWidget)
        self.gridLayout.setMargin(0)
        self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
        self.horizontalLayout = QtGui.QHBoxLayout()
        self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
        self.label = QtGui.QLabel(self.layoutWidget)
        self.label.setObjectName(_fromUtf8("label"))
        self.horizontalLayout.addWidget(self.label)
        self.entrada = QtGui.QLineEdit(self.layoutWidget)
        self.entrada.setObjectName(_fromUtf8("entrada"))
        self.horizontalLayout.addWidget(self.entrada)
        self.gridLayout.addLayout(self.horizontalLayout, 0, 0, 1, 1)
        self.boton = QtGui.QPushButton(self.layoutWidget)
        self.boton.setObjectName(_fromUtf8("boton"))
        self.gridLayout.addWidget(self.boton, 1, 0, 1, 1)
        self.horizontalLayout_2 = QtGui.QHBoxLayout()
        self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2"))
        self.label_3 = QtGui.QLabel(self.layoutWidget)
        self.label_3.setObjectName(_fromUtf8("label_3"))
        self.horizontalLayout_2.addWidget(self.label_3)
        self.salida = QtGui.QLineEdit(self.layoutWidget)
        self.salida.setObjectName(_fromUtf8("salida"))
        self.horizontalLayout_2.addWidget(self.salida)
        self.gridLayout.addLayout(self.horizontalLayout_2, 2, 0, 1, 1)
        self.retranslateUi(Dialog)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi(self, Dialog):
        Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "Dialog", None, QtGui.QApplication.UnicodeUTF8))
        self.label.setText(QtGui.QApplication.translate("Dialog", "Introduzca su DNI", None, QtGui.QApplication.UnicodeUTF8))
        self.boton.setText(QtGui.QApplication.translate("Dialog", "Hallar NIF", None, QtGui.QApplication.UnicodeUTF8))
        self.label_3.setText(QtGui.QApplication.translate("Dialog", "NIF:", None, QtGui.QApplication.UnicodeUTF8))


if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    Dialog = QtGui.QDialog()
    ui = Ui_Dialog()
    ui.setupUi(Dialog)
    Dialog.show()
    sys.exit(app.exec_())

以及我用我需要的功能制作的代码:

from Dni import Ui_Dialog
from PyQt4 import QtCore, QtGui

LETRADNI = {0:'T', 1:'R', 2:'W', 3:'A', 4:'G', 5:'M', 6:'Y', 7:'F', 8:'P', 9:'D', 10:'X', 11:'B', 12:'N',
            13: 'J', 14:'Z', 15:'S', 16:'Q', 17:'V', 18:'H', 19:'L', 20:'C', 21:'K', 22:'E'}


# Se hereda de la clase QtGui.QMainWindow
class Principal(QtGui.QMainWindow):
    # Se define el constructor de la clase __init__
    def __init__(self):
        # Se llama al constructor de la clase padre
        QtGui.QMainWindow.__init__(self)

        # Se crea la instancia de Ui_Dialog
        self.ventana = Ui_Dialog()
        self.ventana.setupUi(self)

        # Se conectan las señales con los slots
        self.connect(self.ventana.boton,QtCore.SIGNAL('clicked()'), self.letradni)


def Calcula_letra_dni(dni):
    '''Función Calcula_letra_dni:

        Funcionamiento:

            La función recibe el valor entero dni. Posteriormente calculará el resto de la división
            por 23. Éste número se buscará en el diccionario 'LETRADNI' para obtener la letra correspondiente
            a ese DNI.

        Argumentos

            dni -- número del documento nacional de identidad (int)

        Devuelve:

            Una cadena (string) -- DNI + letra preparado para salida por pantalla
    '''
    #if len(str(dni))>8 & len(str(dni))<7:
    #    raise ValueError('El dni debe tener entre 7 y 8 cifras')

    num_letra = dni % 23.0

    letra = LETRADNI[num_letra]

    return '{0}-{1}'.format(dni,letra)


def letradni(self):
    self.ventana.salida.setText(Calcula_letra_dni(self.ventana.entrada.text()))

第一个编译运行,完美展现了我的ui。

编译第二个我收到一条错误消息:

Description                                 Resource  Path  Location   Type
Undefined variable from import: QString Dni.py    /Dni  line 18    PyDev Problem

谁能帮帮我?

提前致谢。

【问题讨论】:

  • 已编译?这似乎可能特定于您的 eclipse PYTHONPATH。您的代码本身实际上工作得很好。
  • 我说得太早了,我仔细看了之后,你对这个脚本还有其他问题

标签: pyqt4 qstring python-3.2


【解决方案1】:

首先,我认为您列出的实际问题与 Eclipse、pydev 和您的项目 PYTHONPATH 有关。查看此内容以确保您已正确设置所有内容并将 PyQt4 包含在您的 pythonpath 中:
http://popdevelop.com/2010/04/setting-up-ide-and-creating-a-cross-platform-qt-python-gui-application/

在那之后,你的代码似乎有一些问题超出了你所提到的......

首先定义Principal 类,然后定义Calcula_letra_dni 函数,然后定义看起来像类实例方法letradni 的东西,它应该是Principal 的一部分:

class Principal(QtGui.QMainWindow):
    # Se define el constructor de la clase __init__
    def __init__(self):
        ...

    def letradni(self):
        ...


def Calcula_letra_dni(dni):
    ...

然后,当您尝试对字符串 (感谢 @Avaris) 和浮点数进行数学运算时,您似乎会引发异常:
num_letra = dni % 23.0

您应该先将该字符串转换为浮点数:num_letra = float(dni) % 23.0

最后,我想你也忘了为你的应用程序定义一个main。你有一个在你的Dni.py 中自动生成的,但你没有为你的实际入口点脚本编写一个:

if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    form = Principal()
    form.show()
    sys.exit(app.exec_())

【讨论】:

  • 在 Py3.x 中,QString 在 PyQt4 中不存在。应该返回 QString 的所有内容都将返回常规 Python 字符串 (unicode) 对象。尽管如此,它仍然不是一个数字的事实仍然存在:)。
  • @Avaris:感谢您指出这一点。我还没用过 Py3.x。
  • 在您的帮助下我解决了这个问题!非常感谢你!我纠正了你告诉我的所有事情,现在运行得很好。我添加到我的程序try: from Dni import Ui_Dialog except: pass 以避免 QString 的问题,它似乎工作正常。
  • @dpolot:很高兴听到这个消息!尽管我认为尝试将导入包装起来可能是错误的举动,但除外。如果Ui_Dialog 无法打开,您的程序不会严重失败吗?如果您使用的是 py3.2,您确定使用 pyuic4 --pyqt3-wrapper 吗?
猜你喜欢
  • 2023-03-16
  • 2015-04-22
  • 2010-11-26
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 2019-01-05
  • 1970-01-01
相关资源
最近更新 更多