本来这一篇是想写一下怎么使用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 PyQ import QApplication, QWidget app = QApplication) 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() ())
对于独立的顶层窗口,它的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 PyQ import QApplication, QWidget, QPushButton if __name__ == "__main__": app = QApplication) 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的子控件,这样在移动位置时才会以父控件为参照 # 相当于b(main_widget) btn = QPushButton(main_widget) b("我是按钮") b(100, 30) b(100, 100) # 打印一下位置信息 print("main_widget") print("x=%d, y=%d" % (), main_widget.y())) print("width=%d, height=%d" % (), main_widget.height())) print("geometry") print("x=%d, y=%d" % ().x(), main_widget.geometry().y())) print("width=%d, height=%d" % ().width(), main_widget.geometry().height())) print("frameGeometry") print("x=%d, y=%d" % ().x(), main_widget.frameGeometry().y())) print("width=%d, height=%d" % ().width(), main_widget.frameGeometry().height())) main_widget.show() ())