pyqt5的基本控件整理

当初就不该踩这个坑,答应老师写这个软件干嘛。算了,给自己点动力。

学了一个星期的PyQt5(主要是玩),用于GUI(graphicx user interface)开发。想在这里整理基本控件的用法和功能,在后期开发软件中便于查询(整理知识,按照软件需求的功能,筛选合理的控件)。

因代码太长,所以每节的代码都会在章节最后一压缩包的形式呈现,且,本文不适合没有GUI开发经验的人看,但是代码适合新手观看。如果真的是新手来看此文,还是建议多写写,结合代码多看看。

多年前写过的GUI(西电的优研答辩)效果如下,可以做到不错的效果,但是还是要系统的学一下。

工具

使用QtDesigner,可视化的GUI设计工具。采用拖拽式界面,在大多情况下可以轻松对布局、控件、变量名,甚至是菜单栏、工具栏进行便捷的管理。界面为 .ui 文件,而以记事本打开会发现是 XML 格式的文件,即 .ui 文件里面包含的内容会按照 XML 格式处理, pyuic5 会将 .ui 文件转为 .py 文件,之后将 .py 文件引入自定义的代码中。

但QtDesigner也并非最好,如在信号与槽的实现中,就不如直接写代码方便。

# -*- coding: UTF-8 -*- 避免出现中文乱码。

布局

布局主要为绝对布局和使用布局管理器进行布局。

绝对布局

绝对布局是最傻的一种方式,只有两三个控件问题不大。但对于大规模的软件开发,控件数量过多会造成严重不便。如新加空间,可能会全部重新布局,且控件的大小和位置不会随窗口大小变化而变化。

布局管理器布局

分为水平、垂直、网格、表单四种方式。表单主要用于两列的布局,左边是 key ,右边是 value 。网格布局较为便利,可以设置控件的其实坐标和横跨坐标,设置较为精确。控件的间距(addStretch)、对其方式(Qt.AlignLeft)均可以调节。还可以实现嵌套布局,如下图所示(水平布局、垂直布局嵌套在网格布局中)。

均在QtDesigner里面实现,因此无代码。

尺寸

可以通过QtDesigner里面的 minimumsizemaximumsize 属性设置控件随窗口大小变化而变动的最小尺寸与最大尺寸。 sizepolicy 可以设置水平、竖直方向的延伸策略,如 minimum , maximum , fixed 等。

实战

在窗口中加载子窗口。

- childrenform.py 是 childrenform2.ui 的生成文件
- mainwindow2.py 是  mainwindow.ui 的生成文件
- layout.py 是主文件,调用了mainwindow2和childrenform
所以执行方式为 :python layout.py

单击工具栏按钮会调用子窗口

    # 单击工具栏按钮触发
    self.actiontst.triggered.connect(self.child_show) 
    # 单击后,加载子窗口
def child_show(self):
    self.gridLayout.addWidget(self.child)
    self.child.show()

基本窗口控件

窗口是指:没有嵌入到其他控件中,还有标题栏,菜单栏等,是程序的整体界面,控件是指按钮、文本框等组成程序的基本元素。一个程序可以有多个窗口,一个窗口可以有多个元素。

QMainWindow 是最常见的窗口形式,继承自 QWidgetQWidget 也是所有用户界面对象的基类。

主函数的执行流程如下:

if __name__ == "__main__":
    # 在shell中执行
    app = QApplication(sys.argv)
    mywin = MyMainWindow()
    mywin.show()
    sys.exit(app.exec()) # 开始主循环,直到退出

事件代码在主循环开始,接受消息发送给各个控件,点用 exit() 或者主窗口被销毁,主循环就会退出。程序运行成功,返回0。

返回0的原因是:PyQt5的底层是C++,C++的 main 函数返回结果相当与调用了 exit 函数, main 函数的返回值会传送给 exit 函数,0表示圆满结束。 return 1 不具备移植性。`````

窗口基本实现

功能 描述
创建主窗口 继承自 QMainWindow
窗口居中显示 计算屏幕尺寸,窗口尺寸,除以2
关闭窗口 QApplication.instance().quit()
设置图标 仿苹果主题不会被显示,因为苹果左上角是三个按钮
显示气泡信息 设置为随鼠标移动比较合适
Qlabel 用于信息提示,显示图片、网页链接、不可编辑的文本
QLineEdit 单行文本编辑,可设置掩代码、显示方式,内容改变后可发射信号链接到槽函数。可以增加验证器,屏蔽无效输入。
QTextEdit 多行文本编辑,与但行文本编辑基本类似,可以显示Html文档。

按钮类控件

在任何GUI中,按钮都是常用的出发动作的请求方式,用于和用户的交互操作。

功能 描述
QPushButton 常见按钮,可设置图标,可控制按钮可用与不可用,点击后发射信号到槽函数。
QRadioButton 用户之可以选择一个选项,用于多选一的互斥选项,如性别。切换状态后发射信号。
QCheckBox 多选多,可以设置图标。
QComboBox 下拉列表框,可以获得当前所选项和索引,可用于限制输入。
Qslider 滑动条,设置刻度,最大值最小值,如控制坐标轴的大小。

对话框类控件

一些提示框,如选择字体、颜色等,所有对话框的父类是 QDialog ,子类如下。

功能 描述
QMessageBox 用于提示信息, 如警告、询问和严重出错等。
QFileDialog 用于打开文件和保存文件,可以设置过滤器限制文件后缀名。
QFontDialog 用于设置字体。
QInputDialog 用于控件的标准输入,如 getInt 只能获得整数输入。
QColorDialog 用于设置颜色。

日期

用日期类的控件输入,可以避免用户的输入不规范。

功能 描述
QCalendar 以网格日历的形式输入日期,可以获取日期,日期改变后发射信号
QDateTimeEdit 可编辑日期,感觉不好用,可以设置为弹出日历。
QCalendar 以日历的形式输入日期
QCalendar 以日历的形式输入日期

菜单栏、状态栏、工具栏

菜单栏、工具栏的创建和编辑在QtDesigner里面比较容易实现。用代码实现反而舍近求远。

状态栏的理想是:鼠标在哪里就显示什么信息,但不太好实现。但也不是不能实现,只是学完基本控件还不能实现,需要学一下信号与槽的高级设置。

实现

基本控件练习

以上所有功能的界面如下所示:

软件运行界面如下:(上面提到的基本内容都有)

我来评几句
登录后评论

已发表评论数()

相关站点

+订阅
热门文章