zoukankan      html  css  js  c++  java
  • PyQt QString 与 Python str&unicode

        昨日,将许久以前做的模拟网页登录脚本用PyQt封装了一下,结果出大问题了, 登录无数次都提示登录失败!!而不用PyQt实现的GUI登录直接脚本登录无数次都提示登录成功!!心中甚是伤痛,于是探究起来,解决这一问题。

        问题描述及证据如下:

     

    上图是脚本MD5加密过程及结果

    上图是PyQt GUI中获取密码框内容后加密的结果,其实现代码如下:

    # -*- coding: gbk -*-
    '''
    Version : Python27
    Author  : Spring God
    Date    : 2013-6-28
    '''
    
    from PyQt4 import QtCore, QtGui, Qt
    from UI import Ui_MainWindow
    import md5
    
    class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
    
        def __init__(self, parent = None):
    
            # 初始化
            super(MainWindow, self).__init__(parent)
            self.setupUi(self)
    
        def login(self):
    
            password = self.lineEdit_Password.text()
            print(md5.md5(password).hexdigest())
    
    
    if __name__ == "__main__":
    
        import sys
    
        app = QtGui.QApplication(sys.argv)
        myapp = MainWindow()
        myapp.show()
        app.exec_()

        两者完全不同,这是怎么回事儿,开始探寻之旅:

        一开始在输出加密密码之前先输出了传入加密的字符串,都是123456,无果。

        然后想到是不是文件或者字符编码的问题,于是在输出加密密码之前先输出了传入加密的数据类型,果然找到了:在Python中是str,而在PyQt中却是PyQt4.QtCore.QString,这是个神马东西,看起来像是PyQt自己搞的数据类型。

        于是上网搜索一下:
        关键词:PyQt QString str

        找到了Python String和PyQt QString的区别(转)这篇文章,看了一下,大致是说这两种类型字符串在有些场合需要互相转换,而且对中文的支持不是很好。我想骂人了,这PyQt主管界面开发就是了嘛,干嘛要自己弄个数据类型,简直是让这些Python爱好者头痛。

        关键词:Qt md5 加密

        找到了一些解决方案:

        http://stackoverflow.com/questions/5495281/generating-a-md5-hash-with-qt

    QString encodedPass =QString(QCryptographicHash::hash(("myPassword"),QCryptographicHash::Md5));
    QString blah =QString(QCryptographicHash::hash(("myPassword"),QCryptographicHash::Md5).toHex());

        http://blog.csdn.net/ei__nino/article/details/7306819

    QString usernamemd5;  
    QString pwdmd5;  
    QByteArray bb;  
    bb = QCryptographicHash::hash ( password.toAscii(), QCryptographicHash::Md5 );  
    pwdmd5.append(bb.toHex());  
    bb = QCryptographicHash::hash(username.toAscii(),QCryptographicHash::Md5);  
    usernamemd5.append(bb.toHex());

        总归就是使用PyQt的md5加密模块是吧。但是如果遇到这样的问题就妥协,那就存在不断大量改动代码的情况了,而且不利于GUI移植。

        突然看到上面代码中的password.toAscii(),这该是一个转换的函数,查了一下文档,还有一个toUtf8的函数等等,这下有救了。将QString转换成str试试吧。

    # -*- coding: gbk -*-
    '''
    Version : Python27
    Author  : Spring God
    Date    : 2013-6-28
    '''
    
    from PyQt4 import QtCore, QtGui, Qt
    from UI import Ui_MainWindow
    import md5
    
    class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
    
        def __init__(self, parent = None):
    
            # 初始化
            super(MainWindow, self).__init__(parent)
            self.setupUi(self)
    
        def login(self):
    
            password = self.lineEdit_Password.text()
            print(md5.md5(password.toUtf8()).hexdigest())
    
    
    if __name__ == "__main__":
    
        import sys
    
        app = QtGui.QApplication(sys.argv)
        myapp = MainWindow()
        myapp.show()
        app.exec_()

       果然,将图中蓝底白字的代码加上就正确了。特此记事,以待备用。

     
  • 相关阅读:
    PHP处理字符中的emoji表情
    CentOS 7 安装 PHP7.2 (LNMP环境搭建第二步)
    php 二维数组按某个字段排序
    JavaScript返回到上一页的方法
    常用正则表达式—手机号码
    JS实现斐波那契列数的三种方法
    常用正则表达式--金额
    PHP中三种设置脚本最大执行时间的方法
    生成指定长度随机字符串
    API常用签名验证方法(PHP实现)
  • 原文地址:https://www.cnblogs.com/doudongchun/p/3698433.html
Copyright © 2011-2022 走看看