一,概念
1,QT是一个强大的工具库,提供可视化窗口,它是基于C++开发的。pyqt和pyside这两个python库使得可以用python来调用QT库。Pyqt出现更早,社区资料更多。二者的主要区别在许可证上。【PyQt有两种许可协议,一种是GPLv3许可协议,另一种是需要授权的商业许可协议,GPLv3许可协议是指,如果的你的程序引用了该协议的程序,则你的程序也必须开源,如果你想要商业闭源,则必须购买该公司的商业许可协议。后来Nokia公司希望PyQt的GPLv3协议修改改LGPLv3协议,可以吸引更多的商业用户,但是riverbank computing公司拒绝了,因此,Nokia公司单干,推出了PySide】
二,控件Widgets
(一)app和窗口
1,应用程序控件QApplication
QApplication 提供了整个图形界面程序的底层管理功能,比如:初始化、程序入口参数的处理,用户事件(对界面的点击、输入、拖拽)分发给各个对应的控件等。这个控件必须第一个创建。
app = QApplication([])
2,主窗口空间QmainWindow
创建Qapplication之后什么都不发生,必须要创建窗口空间在写window.show()才会有弹窗,但这个弹窗是空白的,只有标题没有内容。
window = QMainWindow()
ps.这两个控件无父级控件
(二)功能控件
1,控件之间有嵌套关系,功能控件一般都有父级控件,一般为window。它们创建实例的时候,传的一个参数就是父亲名。
2,QplainTextEdit文本输入框控件
3,QpushButton按钮类。创建实例时,参数1写“按钮上显示的字”,参数2是父亲名。
4,QmessageBox消息弹窗。
三,信号与槽
1,当界面上一个控件被操作时,比如被点击、被输入文本、被鼠标拖拽等,就会发出信号signal。我们需要事先定义一个函数来处理signal,这种处理函数叫做slot。然后在到控件下面加一行代码把控件和函数连接起来。
控件对象.信号.connect(槽函数)
2,自定义信号
(1)默认信号一般是被点击click,还可以自定义信号,它需要代码手动发送。
(2)定义方法:my_signal = pyqtSignal(str)。必须写在类中方法外
(3)代码中emit的信号是什么类型的,在定义pyqtSignal时也写对应的参数
(4)对于普通信号,需要指定它是哪一个控件的,连接时写作控件对象.信号.connect(槽函数)。但是自定义信号不属于某个控件,默认都是属于窗口的
(5)使用步骤
①创建pyqtSignal(xxx)的一个实例
②连接信号与槽函数。写作:self.信号.connect(槽函数)
③定义槽函数。pyqtSignal创建实例时形参是什么样,槽函数形参也要是那样
④发送信号
3,一般使用
qt设计师来决定页面,但是信号与槽却不使用设计师,而是获取ui文件中的对象,在把对象连接到函数上面。
Ps,在qt设计师中,要注意在对象管理器中为对象重命名
四,如何引用.ui文件
1,有两种引用方法。直接加载.ui文件、使用uic把ui文件转换为py代码之后再引用代码。最好使用ui动态加载方式,因为它不需要转换十分方便。若程序里面有非qt designer提供的控件则需要使用转换为py的方式。
2,引用uic转换后py文件的两种方法
(1)直接在转换成的文件中加上mian函数
(2)新定义一个类,该类继承QD中创建窗口时选中的类型。主窗口是
五,Qt Designer
1,刚打开它时,会弹出创建window的提示。它只负责窗口,app需要去调用它的python中创建。我们一般选Widget,这是一个什么都没的空窗口。如果选Main Window的话会有菜单栏(点击之后出现选项,而非tab这种跳转页面的)。选完之后就会出现窗口,如果把那个窗口叉掉又会回到这个创建窗口的页面。
2,左侧的是控件区域。右上的是对象区域,拖拽到画布上的控件都会出现在对象区域。右下的对象属性区域,给button命名,给窗口指定标题,给文本框加上预输入字,都需要到对象的属性中去编辑。往往一个对象会继承多个父类,所以它会有父类的许多属性,下图中是窗口的属性,右下有2个灰色的,Qobject就是窗口的父类。Qwidget才是它自己。窗体->预览可以看到实际效果。编辑完成后要给对象命名,再点保存,就能存为ui文件,ui后缀其实就是xml文件。
3,控件说明
(1)获取line edit控件中的内容使用text,获取出的是str类型的。若用户输入的是数字,想获取int类型则
num= int(self.ui.ic50_min.text())
plain text edit是上图这种多文本/纯文本输入框。双击它可以加入文字,但不是预显示的,而是一直都在。预显示需要搜索它的属性placeHolderText。获取其中内容必须使用.toPlainText()方法。
smiles = self.ui.smiles_text.toPlainText()
(2)spacers里面是占位符,如果想两个按钮之间加入一段空白,就能拖拽spacers放到里面。
(3)radio button是单选框。但是直接拖到窗口中的单选框会被视为一个父窗口,同时只能选中一个。若想分开,需要同时选中它们然后新建按钮组。
Check BOX是多选框。
(4)tab weight是标签页。
①如果想给标签页添加layout,需要该标签页中有内容。
②想要重命名标签页则在属性中搜索text,在currentTabText中修改。
③tab默认只有2个,想要增加则右键点击插入页。
(5)label控件用来显示一段字(类似于print)它的pixmap 属性中可以选择图片。用它可以显示图片self.ui.label_auc.setPixmap(QtGui.QPixmap(".pyqt/1.jpg"))
(6)combo BOX是下拉框。双击它就能在里面添加内容。
(7)progress bar是进度条。progressBar.setRange(0,5)把进度条分为了几部分,progressBar.setValue(3)是把进度条设置为第几,即60%。
(8)spinBOX是数字增加框,只能为整数。doubleSpinBox是小数增加框,属性decimals用来设置小数位数,默认2位。
使用value来获取其中的值。
epoch=self.ui.spinBox.value()
(9)line edit、text edit、plain text edit都是用户的文本输入框。line edit只能输入单行文本,后两个可以多行输入
(10)
(11)text browser一般用来显示程序输出的提示信息,如用户登录界面,登录成功或失败,都可以用它来显示
4,布局layout
(1)如果不进行布局的话,拖动窗口改变其大小时,里面的控件是固定不变的,不会随画布大小变化。仅当最顶层(窗口级别存在布局时)控件才会随画布改变。窗口级别没有布局时,它左边会有一个叉。
(2)布局的种类
QD提供4种布局,分别是:垂直布局、水平布局、九宫格布局(grid)、表单布局(姓名:输入框)
(3)布局的三种方式
①按住ctrl可以同时选中多个控件,右键点击布局就能选择对应布局了。
②在对象管理器中右击,比如右击window然后直接选择垂直布局,就可以在全局层面做一次布局了。
③在控件管理器中把布局拖进来,然后把控件拖进布局中
(4)若页面比较复杂,则需要从小组合开始布局。添加布局后有点像visio中的组合,也像前端中的div,小程序中的view。会有一个框框把这些控件框住,可以拖动框框改变整体的大小。若是水平布局,则控件水平排列,控件间是会平分布局长度的,所以控件直接间隔一样。
改变间隔的办法:假设有三个控件被组合在一起了,分别找到三个控件Qwidget类下面的sizePolicy->水平/垂直伸展属性(默认值都是0)。若3控件水平水平伸展分别设为1:2:1,则会把本布局(本div/view)平分为4份,控件1、3占一份,控件2占2份。
Ps.点击layout对象,修改它的Stretch属性,更加方便。
(5)在布局时,一定要从小布到大,一直布到window层面存在布局。
(6)下图中push button太大,不想让它独占一行,希望它们缩到正常按钮大小且居中。选中按钮,Qwidget->sizePolicy->水平策略,把Minimum改为fixed,Minimum会使按钮占整个行??,fixed使按钮恢复为它的原始大小(仅框住里面的字)。需要居中只要把它放进一个水平布局中就行了。一个元素无法用选中再右键布局的方式添加(这种方式必须同时选中2个以上控件)。只能从控件中拖进一个布局来,拖进来的布局会变成一条线而不是一个框,没办法把控件拖进布局中。此时需要把控件拖入对象管理器中多出来的布局中。
(7)对象管理器中选中布局,可以发现布局可以设置margin等。
(8)在进行布局时,千万不要去设置min、max尺寸什么的。只选中布局,任何设置其中的layoutStretch,设置比例。
5,按住ctrl键拖动就会变成复制。在visio中也是这样
6,在qt设计师中使用信号/槽编辑器。这里只能做一些特别简单的操作。这四个均是后会出现下拉框。发送者选push button,信号选click,接收者选label,槽选hidden,则在点击按钮之后,label中的字会隐藏。
六,发布可执行文件
1,在sh中执行
pyinstaller httpclient.py --noconsole --hidden-import PySide2.QtXml
加上—noconsole后,窗口就不会运行在cmd黑框框中了,而是只有一个窗口。Pyinstaller会把python解释器、py文件中import的所有包一起放到一个文件夹中。但是PySide2.QtXml文件是使用_ _import_ _方法导入的,无法自动打包,必须手动导入。写作--hidden-import PySide2.QtXml
另外,图片、excel、ui这些,它是不会帮你打包的。需要自己手动拷贝到 dist/pyhon文件名字目录中。
2,给QT窗口添加图标
from PySide2.QtGui import QIcon
app = QApplication([])
app.setWindowIcon(QIcon('logo.png'))
在发布程序时,要把图标也放进打包的文件夹中
3,指定应用程序的图标,发布exe时加上命令
pyinstaller httpclient.py --noconsole --hidden-import PySide2.QtXml --icnotallow="logo.ico"
注意图片后缀必须要是ico,可以用在线转换网站转换。这个图片不需要手动粘贴到文件夹中。
2,还有库叫做py2app,可以发布.app后缀的程序
七,QSS
1,类似于CSS,设置样式。
2,设置方式:
(1)在对象管理器中找一个“容器级别”的对象,在它的属性管理器中找到styleSheet。点击它,在出现的框框中输入CSS语句,如
QPushButton {
color: red ;
font-size:15px;
}
标签:控件,窗口,对象,简介,布局,pyqt,说明,ui,管理器 From: https://blog.51cto.com/u_16558817/9592696