基础窗口控件QWidget简介
本来这一篇是想写一下怎么使用Qt Designer去设计一个界面的,但是我现在通常都是用代码去直接写界面很少用设计器。因为Qt Designer并不是为了python而写的,所以用起来不是很方便。很多初学者可能都比较喜欢使用Qt Designer,因为所见即所得,我以前做MFC开发的时候也是一直用界面设计器,主要是VS的功能非常强大,而且界面设计和代码编写都是使用这个IDE,契合非常完美。但是Qt Designer就一样了。另外一点就是因为你对PyQt5的布局管理器的使用不熟悉,如果你学会了布局管理器的使用,那这些控件的布局其实非常简单。他并不是你所想象的用代码去按像素调整窗口,PyQt5的布局管理器是根据左右布局、上下布局或者栅格布局自动帮你调整到对应的位置,你只需要进行一些微调就可以了。我们在网上搜到的很多代码都是直接去设置控件的绝对位置,这样就误导了很多人。PyQt5的布局管理器是非常好用的,它可以帮我们把大概的布局很简单的就设计好。所以后期我的教程会尽量使用布局管理器。同时在使用的地方也会加上一些注释,这样大家代码看得多了以后就会对布局管理器有一些了解。所以这一篇呢,我们就从控件开始吧,后期如果有时间的话,我再把Qt Designer简单使用写一篇文章。
QWidget
一个程序可以拥有多个窗口,每个窗口都会承载多个控件。所有的窗口和控件都是直接或者间接的继承自QWidget类。
窗口坐标系统
就像大多数GUI系统一样,PyQt5使用的坐标系统也是以左上角为原点(0, 0)。
import sys
from PyQt5.QtWidgets import QApplication, QWidget
app = QApplication(sys.argv)
widget = QWidget()
widget.setGeometry(300, 300, 500, 500)
widget.setWindowTitle("我是主窗口控件")
w1 = QWidget(widget)
w1.setGeometry(100, 100, 200, 200)
w1.setWindowTitle("我是子控件")
w1.setStyleSheet("background-color:blue")
widget.show()
sys.exit(app.exec_())
对于独立的顶层窗口,它的X、Y坐标是针对整个屏幕的,也就是说widget控件设置的300,300是在屏幕上的偏移位置。对于子控件,它的X、Y坐标是针对其父控件的,w1控件设置的100,100是针对widget控件的,在整个屏幕上就是400,400位置。X坐标从上往下一次递增,值越大越靠近屏幕下方,Y坐标从左往右依次递增,值越大越靠近屏幕右方。在PyQt5中获取控件位置有以下三种方式:
- QWidget直接提供的成员函数:x(), y()获得窗口左上角的坐标,width(), height()获取窗口的宽度和高度。
- QWidget的geometry()提供的成员函数:x(),y()获取窗口左上角坐标,width(), height()获取窗口的宽度和高度。
- QWidget的frameGeometry()提供的成员函数:x(),y()获取窗口左上角坐标,width(), height()获取窗口的宽度和高度。
常用的几何结构
QWidget有两种几何结构。
- 不包含外边框。
- 包含外边框。
对于主窗口控件,不包含边框的部分就是客户区,我们可以在其中添加子控件。
不包含外边框
客户区的大小是一个QRect类。要改变窗口的大小,可以使用如下函数:
- 修改窗口大小 QWidget.resize(width, height) Qwidget.resize(QSize)
2.获取窗口大小 QWidget.size()
3.获取窗口的宽和高 QWidget.width() QWidget.height()
4.设置窗口的高度和宽度 QWidget.setFixedWidth(width) QWidget.setFixedHeight(height) QWidget.setFixedSize(QSize) QWidget.setFixedSize(width, height) 设置固定宽度和高度,设置以后,窗口的大小不能改变。
QWidget.setGeometry(x, y, width, height) QWidget.setGeometry(QRect) 同时设置窗口的位置和大小
包含外边框
QWidget包含边框是窗口在整个屏幕上显示的整个区域。
- 获取窗口的位置和大小 QWidget.frameGeometry()
2.设置窗口的位置 QWidget.move(x, y) QWidget.move(QPoint)
3.获得窗口左上角坐标 QWidget.pos()
下面再来一个例子结束今天的文章:
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton
if __name__ == "__main__":
app = QApplication(sys.argv)
main_widget = QWidget()
main_widget.setWindowTitle("我是主窗口控件")
# 相当于main_widget.setGeometry(300, 300, 500, 500)
main_widget.resize(500, 500)
main_widget.move(300, 300)
# QPushButton(main_widget)的意思是将btn作为main_widget的子控件,这样在移动位置时才会以父控件为参照
btn = QPushButton(main_widget)
btn.setText("我是按钮")
btn.setFixedSize(100, 30)
btn.move(100, 100)
# 打印一下位置信息
print("main_widget")
print("x=%d, y=%d" % (main_widget.x(), main_widget.y()))
print("width=%d, height=%d" % (main_widget.width(), main_widget.height()))
print("geometry")
print("x=%d, y=%d" % (main_widget.geometry().x(), main_widget.geometry().y()))
print("width=%d, height=%d" % (main_widget.geometry().width(), main_widget.geometry().height()))
print("frameGeometry")
print("x=%d, y=%d" % (main_widget.frameGeometry().x(), main_widget.frameGeometry().y()))
print("width=%d, height=%d" % (main_widget.frameGeometry().width(), main_widget.frameGeometry().height()))
main_widget.show()
sys.exit(app.exec_())
- HOSTS配置问题导致集群异常故障分析
- Linux Regulator Framework(2)_regulator driver
- systemd的作用
- alsa声卡分析alsa-utils调用过程(二)-tinymixer
- alsa声卡分析alsa-utils调用过程(一)-tinyplay
- ALSA声卡驱动的DAPM(二)-建立过程
- ALSA声卡驱动的DAPM(一)-DPAM详解
- 高通Audio中ASOC的codec驱动(二)
- vue项目里的日期格式化
- CentOS下的Mysql的安装和使用
- vue路由跳转传参数
- 刘寅:TiDB 工具链和生态
- 腾讯云容器微服务API设计实践
- CentOS 7安装Hadoop 3.0.0
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 贪心算法-分数背包问题(Python实现)
- 为什么GNE 不做全自动提取列表页的功能
- 百度地图开发如何自定义控件(无敌的解决办法)
- 百度地图如何创建一个属于自己的地图,附加到项目中?
- FreeRTOS系列第9篇---FreeRTOS任务概述基础篇
- 图书管理系统(四)图书管理系统实战(2)
- 源码分析之 FactoryBean接口不为人知的秘密
- 图书管理系统(三)图书管理系统实战(1)
- 图书管理系统(二)整合 SSM,你学会了么
- CellChat:细胞间相互作用分析利器
- 我对一类常考算法面试题的详细分析
- Python 面向对象编程(上篇)
- 基于TencentOS-tiny实现PM2.5传感器(攀藤PMSA003)数据解析思路及实现
- Centos7搭建SVN+Apache+iF.SVNAdmin实现web管理SVN
- 安卓最后一个大题复习