pyqt5简单使用心得

本篇不讲什么画UI的代码心得...本来我也不喜欢画ui
也不扯信号与槽那些概念,反正就是讲一下快速上手的方法,如何快速实现想要的功能。
反正正统画UI教程一搜一大堆,比如这里讲的很详细了。

不得不说,pyQtC++Qt简单好多...
首先安装,只需要pip install pyqt5就好,不需要去官网下载什么东西。
不过这样安装完看上面链接教程开始写代码的话,就是走困难模式了。
画UI最方便当然是用控件拖来拖去,用代码多麻烦累死人。

所以暂时不要管上面的链接教程,接下来还需要用pip install pyqt5-tools下好qtdesigner,打开进行拖控件的画UI过程。
不要问在哪里,在下好的包文件夹里...找不到就从import pyQt5的源码里跳转打开pyqt5的文件夹去再往前找pyqt5-tools文件夹进去就有这个exe了,什么你用的notepad++不支持跳转赶紧换vscode或者重量级的pycharm吧。
不过这个软件好像是英文的哎,虽然网上有的是中文可能是另下的...要有起码的英文水平,也不难实在不行就对着查单词。
像什么这个软件似乎做不出来的图标和浮动提示框在上面的教程有可以在后期用代码补一下。

画完左上角保存到桌面或者其他地方后,在那个目录只需要pyuic5 -x untitled.ui -o test.py就可以生成能直接运行的代码了。不加-x的话要改成pyuic5 -o test.py untitled.ui,不过这样的话还不能直接运行,要在下面加好几行代码:

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_())

但是用第一条命令的话,这些代码是自动补上的,所以更方便。

下面总结一下用到的几个控件,注意要对Python的类与对象有一定了解。

输入框(textEdit)

一般拿来输入当作input用。也可以用来显示,编辑,再保存。
显示的方法是在当前代码类中定义一个函数

    def setTextEdit(self, category: str):
        self.textEdit.setText('...<b>测试</b>.......(pyQt的所有显示文字都可以用html语法)')

括号里可以是功能函数的返回值,于是就输出到界面上了。其实连接逻辑实现函数就有信号与槽的概念了...从实际功能转到为它取1个名字比较容易接受。

按钮(pushButton)

点击触发其他函数运行

self.pushButton.clicked.connect()

括号里是要运行的类内函数的名字,就像用多线程threading等模块一样,不需要带括号。如果那个函数不止self一个参数,就用lambda表达式然后是完整的函数带括号带参数,当然还有别的方法,不过lambda表达式比较直观

self.pushButton.clicked.connect(lambda: self.reloadTextEdit(args1, args2, ...))

文本浏览框(textBrowser)

用来显示文本,不可编辑。
不清空的显示用的比较多,实际上是一个列表持续append每行数据。也就是说这个列表元素必须是str类型。

import xxx  # 当前目录下的其他.py文件,提供逻辑功能实现


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        pass  # 这里就省略了
    def func(self):
        for i in xxx.afunc(self.textEdit.toPlainText()):
            self.textBrowser.append(i)

这个func()一般就是上面pushButton的连接函数之一了。
self.textEdit.toPlainText()相当于input()
很多时候其实输入.之后等ide弹出相关的方法,直接输text看看还剩下啥就猜得到需要用啥方法了。当然ide一定要有这个功能,虽然我用的vscode还不算ide,嘛vs2017和pycharm也都可以做到。

下拉框(comboBox)

可以直接在初始化时添加一系列元素,使用self.comboBox.additem()方法,括号内是要添加的元素,或者用self.comboBox.additems()方法,括号内可以是一个列表,所有列表内的元素都变成下拉选项之一。
每次选定下拉元素后,当前选项是self.comboBox.currentText()使用self.comboBox.activated.connect()来激活选项。

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        self.comboBox = QtWidgets.QComboBox(self.centralwidget)
        self.comboBox.setGeometry(QtCore.QRect(700, 180, 240, 30))
        self.comboBox.setObjectName("comboBox")
        self.comboBox.addItems(...)  # 里面是一个list
        self.comboBox.activated.connect(lambda: self.setTextEdit(self.currentCategory()))
        pass  # 这里就省略了

    def currentCategory(self):
        return self.comboBox.currentText()

    def setTextEdit(self, category: str):
        self.textEdit.setText('...')

图标

上面链接里入门教程就有图标和悬浮提示,后者没啥问题就不写了,前者如果不熟悉类的话可能一下子写不对。

    def retranslateUi(self, MainWindow):
        pass
        MainWindow.setWindowIcon(QtGui.QIcon('icon.png'))
        pass

其实大致上的代码是在最下面的retranslateUi函数(这是ui转化成代码时自动生成的函数)里加一行就行,icon.png是放在当前目录下的图片文件名。打包后的话要和exe文件放在一个文件夹。

暂时就用到以上这些,像是label这样超级基础的玩意就算了不写了。
最后,用pyinstaller打包的话,直接打包由于不认识pyqt的动态链接库会有一些错误,应该这样

pyinstaller --paths C:\Users\...\AppData\Local\Programs\Python\Python36\Lib\site-packages\PyQt5\Qt\bin -F -w test.py xxx.py

paths后面的路径是自己电脑里pyqtbin文件夹位置,一般默认只要把上面的省略号换成自己用户名就好了。
多个文件打包只需要空格分开就好。
-F加上后会只生成一个exe文件,否则会生成很多其他文件。
-w加上后运行程序不会出现命令行背景。也就是说看不到如果崩溃时的错误信息,只是给用户用的。

好了,以上代码虽然足够随便写一个软件出来...
但是有两个严重问题:

  1. 逻辑实现和UI实现代码没有分开在不同线程工作,如果逻辑实现运行比较久的话程序就卡住了。再鼠标点击下可能就崩溃了。
  2. 直接依靠拖动定位的话,在不同分辨率上的显示效果不一样,可能错位或者部分显示被吃了,以及拉伸界面不会自动空间跟着过去。

哎反正我只有三天时间强行做出来的这么一个东西,一开始完全一脸懵比状态啥也不知道,就暂时不要要求太高了。
而且客户端时代早已过去,web才是未来。

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

推荐阅读更多精彩内容