您的位置:首页 > 编程语言 > Qt开发

PyQt实现一个简单的License系统(一)

2017-06-01 14:35 330 查看
    本文主要介绍如何用PyQt实现一个License系统。事实上,这个“License系统”在之前已经用Qt实现过了,因此对于“需求分析”、“软件设计”等内容不再重复介绍。博客链接:

      http://blog.csdn.net/sagittarius_warrior/article/details/53501282
    本人最近在学习python,特别是PyQt,于是选择用python来重新实现一下这个软件。本文要重点介绍的是:

1)PyQt、WinPython的安装、配置。

2)如何用PyQt编译QDesigner生成的*.ui文件。

3)如何用python创建一个GUI。

4)python如何调C DLL库。

5)ctypes中类型处理。

6)如何用VS调试被python调用的DLL库。

7)如何设置VS为python的IDE。

8)如何在C++中嵌入python。

9)如何构建和优化高效python代码。

       本文实际上就是以这个“License系统的实现”为例,演示上述知识点,鉴于篇幅,可能要分割成多篇博文。

一、PyQt的安装、配置

    关于PyQt的安装,参考“Read Create Simple GUI Applications”这篇博文就够了。

    https://leanpub.com/create-simple-gui-applications/read#leanpub-auto-qt-and-pyqt
    该博文给出了Windows、Linux和MaxOs系统中安装PyQt的详细教程。我分别在Ubuntu16.4和Win10下试过了,都能安装。

1,Linux(Ubuntu)

    Ubuntu16.4是自带Python的,不过需要注意的是:它里面既嵌有python2,也嵌有python3。默认情况下,你在“Terminal”中输入“python”,它打开的是python2.7;只有在输入“python3”时,才执行python3。这一点特别需要注意。如下图所示:



    如上图所示,我的Ubuntu系统中已经安装了有python了,我只需要在“terminal”中输入如下命令:

apt
-
get
install
python3
-
pyqt5

    然后根据提示,选择“Yes”即可安装完成。

2,WinPython

    上述博文也给出了在Windows系统下的PyQt安装方法,不过,我后来发现Windows下直接安装“WinPython”更好,它集成了包括PyQt在内的一些常用的python库,如下:



    WinPython的安装就比较简单了,直接到官网:https://winpython.github.io/

下载指定版本的WinPython,解压到某个指定目录下即可。它实际上是一个免安装版的,在开始菜单里是看不到的,卸载的时候直接删除文件夹即可。

    解压好后,需要做的是:配置环境变量。

右键“我的电脑”  ->  “属性”  ->  “高级”  ->  “环境变量”  ->  “Path”

加上:

1)python.exe所在的目录路径;

2)scripts的路径;

配置好后,打开cmd,键入命令进行测试:



如上图所示,表示安装配置成功。

二、PyQt编译QDesigner生成的*.ui文件

    QDesigner是一个图形化的界面设计软件,设计好界面后,保存的文件为“*.ui”,它实际是一个xml文件。通过PyQt可以将该ui文件编译成一个“*.py”文件。

    对于“LicenseSystem”工程,我之前已经设计好了界面,参考我之前的博文

    http://blog.csdn.net/sagittarius_warrior/article/details/53501282

    取出那个“mainwindow.ui”文件,放到一个目录下,然后进行如下操作:



如上图所示:实际就是用WinPython目录下的“pyuic5.bat”将ui文件编译成py文件。

生成的mainwindow.py文件代码如下:

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

# Form implementation generated from reading ui file 'mainwindow.ui'
#
# Created by: PyQt5 UI code generator 5.8.1
#
# WARNING! All changes made in this file will be lost!

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(890, 614)
MainWindow.setMinimumSize(QtCore.QSize(800, 600))
self.centralWidget = QtWidgets.QWidget(MainWindow)
self.centralWidget.setObjectName("centralWidget")
self.gridLayout = QtWidgets.QGridLayout(self.centralWidget)
self.gridLayout.setContentsMargins(11, 11, 11, 11)
self.gridLayout.setSpacing(6)
self.gridLayout.setObjectName("gridLayout")
self.splitter = QtWidgets.QSplitter(self.centralWidget)
self.splitter.setOrientation(QtCore.Qt.Horizontal)
self.splitter.setHandleWidth(60)
self.splitter.setObjectName("splitter")
self.layoutWidget = QtWidgets.QWidget(self.splitter)
self.layoutWidget.setObjectName("layoutWidget")
self.verticalLayout = QtWidgets.QVBoxLayout(self.layoutWidget)
self.verticalLayout.setContentsMargins(11, 11, 11, 11)
self.verticalLayout.setSpacing(6)
self.verticalLayout.setObjectName("verticalLayout")
self.horizontalLayout = QtWidgets.QHBoxLayout()
self.horizontalLayout.setContentsMargins(11, 11, 11, 11)
self.horizontalLayout.setSpacing(6)
self.horizontalLayout.setObjectName("horizontalLayout")
self.label_1 = QtWidgets.QLabel(self.layoutWidget)
self.label_1.setMinimumSize(QtCore.QSize(80, 0))
self.label_1.setAlignment(QtCore.Qt.AlignCenter)
self.label_1.setObjectName("label_1")
self.horizontalLayout.addWidget(self.label_1)
self.lineEdit_1 = QtWidgets.QLineEdit(self.layoutWidget)
self.lineEdit_1.setMinimumSize(QtCore.QSize(200, 0))
self.lineEdit_1.setObjectName("lineEdit_1")
self.horizontalLayout.addWidget(self.lineEdit_1)
self.verticalLayout.addLayout(self.horizontalLayout)
self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
self.horizontalLayout_2.setContentsMargins(11, 11, 11, 11)
self.horizontalLayout_2.setSpacing(6)
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
self.label_2 = QtWidgets.QLabel(self.layoutWidget)
self.label_2.setMinimumSize(QtCore.QSize(80, 0))
self.label_2.setAlignment(QtCore.Qt.AlignCenter)
self.label_2.setObjectName("label_2")
self.horizontalLayout_2.addWidget(self.label_2)
self.lineEdit_2 = QtWidgets.QLineEdit(self.layoutWidget)
self.lineEdit_2.setMinimumSize(QtCore.QSize(200, 0))
self.lineEdit_2.setObjectName("lineEdit_2")
self.horizontalLayout_2.addWidget(self.lineEdit_2)
self.verticalLayout.addLayout(self.horizontalLayout_2)
self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
self.horizontalLayout_3.setContentsMargins(11, 11, 11, 11)
self.horizontalLayout_3.setSpacing(6)
self.horizontalLayout_3.setObjectName("horizontalLayout_3")
self.label_3 = QtWidgets.QLabel(self.layoutWidget)
self.label_3.setMinimumSize(QtCore.QSize(80, 0))
self.label_3.setAlignment(QtCore.Qt.AlignCenter)
self.label_3.setObjectName("label_3")
self.horizontalLayout_3.addWidget(self.label_3)
self.lineEdit_3 = QtWidgets.QLineEdit(self.layoutWidget)
self.lineEdit_3.setMinimumSize(QtCore.QSize(200, 0))
self.lineEdit_3.setObjectName("lineEdit_3")
self.horizontalLayout_3.addWidget(self.lineEdit_3)
self.verticalLayout.addLayout(self.horizontalLayout_3)
self.horizontalLayout_4 = QtWidgets.QHBoxLayout()
self.horizontalLayout_4.setContentsMargins(11, 11, 11, 11)
self.horizontalLayout_4.setSpacing(6)
self.horizontalLayout_4.setObjectName("horizontalLayout_4")
self.label_4 = QtWidgets.QLabel(self.layoutWidget)
self.label_4.setMinimumSize(QtCore.QSize(80, 0))
self.label_4.setAlignment(QtCore.Qt.AlignCenter)
self.label_4.setObjectName("label_4")
self.horizontalLayout_4.addWidget(self.label_4)
self.lineEdit_4 = QtWidgets.QLineEdit(self.layoutWidget)
self.lineEdit_4.setMinimumSize(QtCore.QSize(200, 0))
self.lineEdit_4.setObjectName("lineEdit_4")
self.horizontalLayout_4.addWidget(self.lineEdit_4)
self.verticalLayout.addLayout(self.horizontalLayout_4)
self.horizontalLayout_5 = QtWidgets.QHBoxLayout()
self.horizontalLayout_5.setContentsMargins(11, 11, 11, 11)
self.horizontalLayout_5.setSpacing(6)
self.horizontalLayout_5.setObjectName("horizontalLayout_5")
self.label_5 = QtWidgets.QLabel(self.layoutWidget)
self.label_5.setMinimumSize(QtCore.QSize(80, 0))
self.label_5.setAlignment(QtCore.Qt.AlignCenter)
self.label_5.setObjectName("label_5")
self.horizontalLayout_5.addWidget(self.label_5)
self.lineEdit_5 = QtWidgets.QLineEdit(self.layoutWidget)
self.lineEdit_5.setMinimumSize(QtCore.QSize(200, 0))
self.lineEdit_5.setObjectName("lineEdit_5")
self.horizontalLayout_5.addWidget(self.lineEdit_5)
self.verticalLayout.addLayout(self.horizontalLayout_5)
self.horizontalLayout_6 = QtWidgets.QHBoxLayout()
self.horizontalLayout_6.setContentsMargins(11, 11, 11, 11)
self.horizontalLayout_6.setSpacing(6)
self.horizontalLayout_6.setObjectName("horizontalLayout_6")
self.label_6 = QtWidgets.QLabel(self.layoutWidget)
self.label_6.setMinimumSize(QtCore.QSize(80, 0))
self.label_6.setAlignment(QtCore.Qt.AlignCenter)
self.label_6.setObjectName("label_6")
self.horizontalLayout_6.addWidget(self.label_6)
self.lineEdit_6 = QtWidgets.QLineEdit(self.layoutWidget)
self.lineEdit_6.setMinimumSize(QtCore.QSize(200, 0))
self.lineEdit_6.setObjectName("lineEdit_6")
self.horizontalLayout_6.addWidget(self.lineEdit_6)
self.verticalLayout.addLayout(self.horizontalLayout_6)
self.horizontalLayout_7 = QtWidgets.QHBoxLayout()
self.horizontalLayout_7.setContentsMargins(11, 11, 11, 11)
self.horizontalLayout_7.setSpacing(6)
self.horizontalLayout_7.setObjectName("horizontalLayout_7")
self.label_7 = QtWidgets.QLabel(self.layoutWidget)
self.label_7.setMinimumSize(QtCore.QSize(80, 0))
self.label_7.setAlignment(QtCore.Qt.AlignCenter)
self.label_7.setObjectName("label_7")
self.horizontalLayout_7.addWidget(self.label_7)
self.lineEdit_7 = QtWidgets.QLineEdit(self.layoutWidget)
self.lineEdit_7.setMinimumSize(QtCore.QSize(200, 0))
self.lineEdit_7.setObjectName("lineEdit_7")
self.horizontalLayout_7.addWidget(self.lineEdit_7)
self.verticalLayout.addLayout(self.horizontalLayout_7)
self.horizontalLayout_8 = QtWidgets.QHBoxLayout()
self.horizontalLayout_8.setContentsMargins(11, 11, 11, 11)
self.horizontalLayout_8.setSpacing(6)
self.horizontalLayout_8.setObjectName("horizontalLayout_8")
self.label_8 = QtWidgets.QLabel(self.layoutWidget)
self.label_8.setMinimumSize(QtCore.QSize(80, 0))
self.label_8.setAlignment(QtCore.Qt.AlignCenter)
self.label_8.setObjectName("label_8")
self.horizontalLayout_8.addWidget(self.label_8)
self.lineEdit_8 = QtWidgets.QLineEdit(self.layoutWidget)
self.lineEdit_8.setMinimumSize(QtCore.QSize(200, 0))
self.lineEdit_8.setObjectName("lineEdit_8")
self.horizontalLayout_8.addWidget(self.lineEdit_8)
self.verticalLayout.addLayout(self.horizontalLayout_8)
self.layoutWidget1 = QtWidgets.QWidget(self.splitter)
self.layoutWidget1.setObjectName("layoutWidget1")
self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.layoutWidget1)
self.verticalLayout_2.setContentsMargins(11, 11, 11, 11)
self.verticalLayout_2.setSpacing(6)
self.verticalLayout_2.setObjectName("verticalLayout_2")
self.horizontalLayout_9 = QtWidgets.QHBoxLayout()
self.horizontalLayout_9.setContentsMargins(11, 11, 11, 11)
self.horizontalLayout_9.setSpacing(6)
self.horizontalLayout_9.setObjectName("horizontalLayout_9")
self.btnPreview = QtWidgets.QPushButton(self.layoutWidget1)
self.btnPreview.setObjectName("btnPreview")
self.horizontalLayout_9.addWidget(self.btnPreview)
spacerItem = QtWidgets.QSpacerItem(308, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.horizontalLayout_9.addItem(spacerItem)
self.verticalLayout_2.addLayout(self.horizontalLayout_9)
self.plaintext = QtWidgets.QTextBrowser(self.layoutWidget1)
self.plaintext.setObjectName("plaintext")
self.verticalLayout_2.addWidget(self.plaintext)
self.horizontalLayout_10 = QtWidgets.QHBoxLayout()
self.horizontalLayout_10.setContentsMargins(11, 11, 11, 11)
self.horizontalLayout_10.setSpacing(6)
self.horizontalLayout_10.setObjectName("horizontalLayout_10")
self.btnEncrypt = QtWidgets.QPushButton(self.layoutWidget1)
self.btnEncrypt.setObjectName("btnEncrypt")
self.horizontalLayout_10.addWidget(self.btnEncrypt)
spacerItem1 = QtWidgets.QSpacerItem(308, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.horizontalLayout_10.addItem(spacerItem1)
self.verticalLayout_2.addLayout(self.horizontalLayout_10)
self.ciphertext = QtWidgets.QTextBrowser(self.layoutWidget1)
self.ciphertext.setObjectName("ciphertext")
self.verticalLayout_2.addWidget(self.ciphertext)
self.horizontalLayout_11 = QtWidgets.QHBoxLayout()
self.horizontalLayout_11.setContentsMargins(11, 11, 11, 11)
self.horizontalLayout_11.setSpacing(6)
self.horizontalLayout_11.setObjectName("horizontalLayout_11")
self.btnDecrypt = QtWidgets.QPushButton(self.layoutWidget1)
self.btnDecrypt.setObjectName("btnDecrypt")
self.horizontalLayout_11.addWidget(self.btnDecrypt)
spacerItem2 = QtWidgets.QSpacerItem(308, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.horizontalLayout_11.addItem(spacerItem2)
self.verticalLayout_2.addLayout(self.horizontalLayout_11)
self.recovertext = QtWidgets.QTextBrowser(self.layoutWidget1)
self.recovertext.setObjectName("recovertext")
self.verticalLayout_2.addWidget(self.recovertext)
self.gridLayout.addWidget(self.splitter, 0, 0, 1, 1)
MainWindow.setCentralWidget(self.centralWidget)
self.menuBar = QtWidgets.QMenuBar(MainWindow)
self.menuBar.setGeometry(QtCore.QRect(0, 0, 890, 23))
self.menuBar.setObjectName("menuBar")
MainWindow.setMenuBar(self.menuBar)
self.mainToolBar = QtWidgets.QToolBar(MainWindow)
self.mainToolBar.setObjectName("mainToolBar")
MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.mainToolBar)
self.statusBar = QtWidgets.QStatusBar(MainWindow)
self.statusBar.setObjectName("statusBar")
MainWindow.setStatusBar(self.statusBar)

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

def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "LicenseSystem"))
self.label_1.setText(_translate("MainWindow", "Company:"))
self.lineEdit_1.setText(_translate("MainWindow", "Softrument"))
self.label_2.setText(_translate("MainWindow", "Product:"))
self.lineEdit_2.setText(_translate("MainWindow", "WIFI Instrument"))
self.label_3.setText(_translate("MainWindow", "SerialNumber:"))
self.lineEdit_3.setText(_translate("MainWindow", "0123456789"))
self.label_4.setText(_translate("MainWindow", "Privilege:"))
self.lineEdit_4.setText(_translate("MainWindow", "0"))
self.label_5.setText(_translate("MainWindow", "Modules:"))
self.lineEdit_5.setText(_translate("MainWindow", "3"))
self.label_6.setText(_translate("MainWindow", "StartDate:"))
self.label_7.setText(_translate("MainWindow", "DueDate:"))
self.label_8.setText(_translate("MainWindow", "CurrentDate:"))
self.btnPreview.setText(_translate("MainWindow", "Preview"))
self.btnEncrypt.setText(_translate("MainWindow", "Encrypt"))
self.btnDecrypt.setText(_translate("MainWindow", "Decrypt"))

if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())


在cmd中键入:“python mainwindow.py”,即可看到如下界面:



    至此,一个基本的GUI已经创建出来了。

    本部分主要参考博文:

    http://projects.skylogic.ca/blog/how-to-install-pyqt5-and-build-your-first-gui-in-python-3-4/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: