文章目录
-
1. 示例:程序的基本结构
-
2. 创建多个控件
-
3. 控件的父子关系
一、基本窗口的绘画
1. 示例:程序的基本结构
pyQt5 很方便的创建一个窗口,以下几行代码既可以创建一个基本的窗口,并设置了其大小,显示位置和标题:
import sys
from PyQt5.QtWidgets import QApplication, QWidget
if __name__ == '__main__':
app = QApplication(sys.argv) #sys.argv 是运行python脚本的时候 可以往程序输入参数
w = QWidget() #创建窗口对象
w.resize(250, 150) #窗口大小
w.move(300, 300) #窗口位置:即运行程序后,窗口的坐标
w.setWindowTitle('Simple') #设置标题为:simple
w.show() #显示窗口
sys.exit(app.exec_()) #程序进入了循环
效果如下:
这个简单的程序演示了怎么设置一个窗口的名称等,pyQt还提供了设置窗口的图标,是否显示标题栏等等。
2. 创建多个控件
上一个程序创建了一个QWidget控件,同样的方法可以再创建一个:
import sys
from PyQt5.QtWidgets import QApplication, QWidget
if __name__ == '__main__':
app = QApplication(sys.argv)
# 第一个控件
w1 = QWidget()
w1.resize(250, 150)
w1.move(300, 300)
w1.setWindowTitle('First ')
w1.show()
# 第二个控件
w2 = QWidget()
w2.resize(250, 150)
w2.move(100, 200)
w2.setWindowTitle('Second')
w2.show()
sys.exit(app.exec_()) # 程序进入了循环
效果如下所示:
可以看到我们创建了2个窗口,标题名为 Second 的窗口在 First 之上,可以知道pyQt默认后创建的控件在上层。
3. 控件的父子关系
指定控件的父子关系,方便统一管理。比如在一个对话框中,里面的拥有QButton,QLabel,QTextEdit控件可以作为这个对话框的子控件,这样当父控件(对话框)被销毁的时候,子控件也自动销毁,而且子控件会约束在父控件中。
上一段代码我们创建了两个空间,现在我们让其中一个作为子控件,另一个作为父控件:
import sys
from PyQt5.QtWidgets import QApplication, QWidget
if __name__ == '__main__':
app = QApplication(sys.argv)
# 父控件
f = QWidget()
f.resize(250, 150)
f.move(100, 200)
f.setWindowTitle('MainWindow') #父控件坐标:原点(0,0)为屏幕的最左上角
# 子控件
s = QWidget()
s.resize(50, 100)
s.move(10, 10) #子控件坐标:原点(0,0)为父控件的最左上角
s.setParent(f) #设置f为s的父控件
s.setStyleSheet("background:red;") #设置s这个控件的背景颜色为红色
f.show() #显示父控件,子控件也自动显示
sys.exit(app.exec_()) # 程序进入了循环
运行效果如下:
这段程序有以下几个知识点:
-
设置父子控件的代码为:
s.setParent(f)
-
子控件没有设置标题栏,是因为没有作用,因为这个控件并没有标题栏,f控件是因为是顶层控件,所以系统自动给添加的,因为这是一个普通基本窗口都会有的结构。
-
通过设置控件的表来配置控件的背景颜色,当然,可以设置显示的文字像素大小,字体等,这里暂且不详说。
创建父控件还有另一种方便的方式,即在创建子控件时候,参数写入父控件,可一步完成创建控件和指定父控件的操作,程序如下所示:
import sys
from PyQt5.QtWidgets import QApplication, QWidget
if __name__ == '__main__':
app = QApplication(sys.argv)
# 父控件
f = QWidget()
f.resize(250, 150)
f.move(100, 200)
f.setWindowTitle('MainWindow') #父控件坐标(0,0)为屏幕的最左上角
# 子控件
s = QWidget(f) #创建子控件s,并指定f为其父空间
s.resize(50, 100)
s.move(10, 10) #子控件坐标(0,0)为父控件的最左上角
s.setStyleSheet("background:red;") #设置s这个控件的背景颜色为红色
f.show() #显示父控件,子控件也自动显示
sys.exit(app.exec_()) # 程序进入了循环
这段程序使用
s=QWidget(f)
来指定f为s的父控件,所以也不再需要 s.setParent(f),注意到,每一个子控件可以指定一个父控件,也只能拥有一个父控件,如果重复指定,那么只有最后指定的父控件是有效的。
二、练习
设计一个简单的窗口,运行效果如下:
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton
if __name__ == '__main__':
app = QApplication(sys.argv)
# 父控件
f = QWidget()
f.resize(250, 150)
f.move(100, 200)
f.setWindowTitle('MainWindow') #父控件坐标(0,0)为屏幕的最左上角
redb = QPushButton('red', f) #这是显示的文字为‘red’,指定父控件为f
redb.setCheckable(True)
redb.move(10, 10)
redb.setStyleSheet("background:red;font-size:20px;")
greb = QPushButton('green', f)
greb.setCheckable(True)
greb.move(100, 10)
greb.setStyleSheet("background:green;font-size:10px;")
f.show() #显示父控件,子控件也自动显示
sys.exit(app.exec_()) # 程序进入了循环