PyQT5--最轻松的入门程序

想当初做QT的第一个程序就是写的是加法器
所以,做PyQT5的时候不意外的选择 做一个加法器
其实,PyQt5中最困难的信号与槽的机制,我基本上很久前就理解了,所以,在这也就比较容易上手。


加法器应用,点击等号就可以运算了

后面有写好的代码(如果不是软件自己生成的部分,我会写了好注释的)
pyqt5安装有很多的坑。
通过这个网页,就可以保证解决你安装的pyqt5的坑,建议复制(这个链接里面还有一个超链接,辅助使用觉得可以帮助安装,否则可以给我发私信,这是一个CSDN博客,我写的)


话是这么说,但是做这个第一个程序的时候还是遇到了很多问题的。
不然的话,我也不会专门写一篇文章。
写这篇文章一方面,蹭着自己刚刚熟悉好了这个东西,巩固一下;另一方面,自己也知道这个过程有多难。网上的教程基本上都是PyQT4的,这两者有很大变化,直接看pyqt4的文档很难上手

在这里,我会建立一个pyQt5的文库,如果遇到有志同道合的朋友,可以往这个文库中发pyQt5的文章。要求不多,但一定是要pyQt5上能够运行的,算是给pyQt5做了比较好的交流环境吧。

信号与槽的机制,其实非常简单

  • 信号端,负责发信号
  • 槽,负责接受信号,并做出反应

没了,就这么简单。
这个就是QT的美所在,网上那么多长片大论其实大部分都是废话(当然啦,拿来读一下涨涨见识也好)

敲黑板: 对于以前熟悉QT的老哥们,也要听

pyqt5中的connect函数,有两种连结方法

  1. 直接对于某个元素的信号函数做一个connect
  • 这点很有趣,我们拿一个button举例
    self.button.clicked这个就是button最典型的信号函数。也就是最常使用的点击函数。
    在pyqt中,可以使用 self.button.clicked.connect(lambda: self.fun())这样的方式来构建联系。
    意思是:在点击这名叫做button的东西之后,就会触发fun函数
    有人可能就问了:为什么这里会有一个lambda呢?
    答: 是这样的,在pyqt中,采用了,一个pyqtSlot的函数。它在PyQt5.QtCore这个类中。 这个函数是一个装饰函数,没错就是会把某一个函数装饰一下,变成一个全新的槽函数。(这也是我们马上就要讲的第二个方法)。而这个新的槽函数,是给这个connect这个函数使用的。一般来说,都是先从这个传递这个函数抛开最外层的槽函数。用这个槽函数的返回的内部的函数。写到这,大家有没想到QT C++的里面是不是在connect中使用了SOLT()这个外壳来封装起来某个函数的对吧。其实,看这篇文章没准还加深了你对Python的装饰器的理解,哈哈哈
    所以,很明显,如果你传进去没有加lambda的话,那你点击这个button之后,估计就是去Call(调用函数)你的这个self.fun的返回值了。
  1. @pyqtSlot() 放到槽函数的头部(就是正常的装饰函数的放法啦!)
    这样也是一样的。
    将这个东西,放到头部之后。我们可以理解,现在你手头上就有了一个封装好的槽函数了
    self.connect(self.button, QtCore.SIGNAL('clicked()'), self.fun) 这就是一个实例。(如果你import了QtCore之后)

看代码部分,非常简单:

  1. 第一部分: import部分(其实是我忘了哪几个是系统自动生成的了。我用了designer的。但是sys是一定要带上的,是为了使用那个sys来结束进程(不然你把这个可视化的软件关的掉么?))
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication
from PyQt5 import QtCore, QtGui, QtWidgets
  1. 第二部分: Class类中函数的修改。(其实是可以在designer中自己手动添加的,但是很明显,这个手动添加这个连结部分是很慢的。熟悉之后,手动写是很快的)
  • 在加了一个连结的connect
self.pushButton.clicked.connect(lambda: self.add()) 
# 信号与槽的连结方式,记得,clicked没有括号,但是add一定要有
  • 加了一个函数add()
    def add(self):
        A = float(self.lineEdit.text())
        B = float(self.lineEdit_2.text())
        self.lineEdit_3.setText(str(A + B))
        pass

有人马上就会问了:那个connect加哪呀?
回答其实很简单:你把这个放在那个系统main函数会自动调用的函数中不就好了?

所以就需要看下面的main函数部分

  1. main函数部分:
    对于部分大的程序,这个部分是可以放到一个新的py文件中,这样就更加维护了整个代码的结构性和安全性。
    但是下面的这段代码是一定要有的
#  自己添加了的main函数代码部分
if __name__ == '__main__':
    app = QApplication(sys.argv)  
    # 系统调用参数给这个类,生成一个应用类
    MainWindow = QMainWindow() 
    # 生成一个主框口。这个不可以少。
    ui = Ui_MainWindow()
    # 生成一个类,我在designer中生成的就是这个类
    ui.setupUi(MainWindow)
    # 调用这个类的函数并传一个主窗口给这个函数中的函数做父类
    # 这样就将某些部件放到了这个框口中
    MainWindow.show()
    # 将这个窗口显示出来
    sys.exit(app.exec_())
   # 如果这个应用关闭的时候,也同样调用sys将整个进程给关掉。

下面的代码,如果你们电脑上有这些库的话,就可以直接运行了。
生成的结果就是一个加法器

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

# Form implementation generated from reading ui file 'add.ui'
#
# Created by: PyQt5 UI code generator 5.10
#
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication
from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(919, 219)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit.setGeometry(QtCore.QRect(30, 50, 231, 61))
        self.lineEdit.setObjectName("lineEdit")
        self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_2.setGeometry(QtCore.QRect(340, 50, 231, 61))
        self.lineEdit_2.setObjectName("lineEdit_2")
        self.lineEdit_3 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_3.setGeometry(QtCore.QRect(670, 50, 231, 61))
        self.lineEdit_3.setObjectName("lineEdit_3")
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(280, 30, 48, 111))
        self.label_2.setObjectName("label_2")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(580, 50, 81, 61))
        self.pushButton.setStyleSheet("font: 28pt \"Agency FB\";")
        self.pushButton.setObjectName("pushButton")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 919, 30))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        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", "MainWindow"))
        self.label_2.setText(_translate("MainWindow",
                                        "<html><head/><body><p><span style=\" font-size:48pt;\">+</span></p></body></html>"))
        self.pushButton.setText(_translate("MainWindow", "="))
        self.pushButton.clicked.connect(lambda: self.add())  # 信号与槽的连结方式,记得,clicked没有括号,但是add一定要有

    def add(self):
        A = float(self.lineEdit.text())
        B = float(self.lineEdit_2.text())
        self.lineEdit_3.setText(str(A + B))
        pass


#  自己添加了的main函数代码部分
if __name__ == '__main__':
    app = QApplication(sys.argv)
    MainWindow = QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())
    pass

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,651评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,468评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,931评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,218评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,234评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,198评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,084评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,926评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,341评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,563评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,731评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,430评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,036评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,676评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,829评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,743评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,629评论 2 354

推荐阅读更多精彩内容

  • 为什么在头文件中有的是使用前置声明,而有的是包含头文件? 如下代码: 前置声明(forward declarati...
    Joe_HUST阅读 1,275评论 0 6
  • 这个例子相对综合一些,包括qt的布局,实现无边框效果,无边框也就是没有了窗口的title栏,没有title栏就不能...
    用电热毯烤猪阅读 3,077评论 0 50
  • 信号和槽(Signals and Slots) Qt库第一个认识到在几乎所有情况下,程序员不需要或甚至不想知道所有...
    珞珈村下山阅读 9,826评论 0 23
  • 转自:作者简介作者:唐新华 (xhsmart@263.net)软件工程师    信号和槽作为QT的核心机制在QT编...
    njukay阅读 1,334评论 0 49
  • Qt学习 模拟登陆界面 登陆账号密码成功时输出ok,否则error 实际效果 将password的echo模式改为...
    I踏雪寻梅阅读 13,205评论 0 5