目录
窗口风格
在上一节我们已经知道PyQt中所有的部件都可以是顶级窗口用来直接显示,但是通常我们会使用QDialog 或 QMainWindow最为顶级窗口,偶尔会使用QWidget。
由此我们可以看出在PyQt中主要有两种界面风格:
- 主窗口风格
- 对话框风格
部件继承关系
既然有顶级部件就会有次级部件。PyQt使用父-子拥有权模型,在PyQt中所有的部件都继承于QtWidget类,同时QtWidget类继承与QObject类,这样可以得出一个简单继承关系:
QObject > QtWidget > all widgets
实例:
import sys
from PySide2 import QtCore
from PySide2 import QtWidgets
class Form(QtWidgets.QDialog):
def __init__(self, parent=None):
super(Form, self).__init__(parent)
self.browser = QtWidgets.QTextBrowser()
self.lineedit = QtWidgets.QLineEdit("Type an expression and press Enter")
self.lineedit.selectAll()
layout = QtWidgets.QVBoxLayout()
layout.addWidget(self.browser)
layout.addWidget(self.lineedit)
self.setLayout(layout)
self.lineedit.setFocus()
self.connect(self.lineedit, QtCore.SIGNAL("returnPressed()"),
self.updateUi)
self.setWindowTitle("Calculate")
def updateUi(self):
try:
text = unicode(self.lineedit.text())
self.browser.append("%s = <b>%s</b>" % (text, eval(text)))
except:
self.browser.append(
"<font color=red>%s is invalid!</font>" % text)
app = QtWidgets.QApplication(sys.argv)
form = Form()
form.show()
app.exec_()
运行结果:
这个程序在下面输入一些运算表达式后按回车,上面会显示相应的结果。
上面Form继承了QDialog类,QDialog派生的类具有一些特定的方法,例如点击x或Esc键关闭窗口。
__init__()方法中有一个parent参数,用来指定父类,然后使用super方法初始化它。在PyQt中当一个部件没有父类时,他就会被指定为顶级部件。这里Form的parent参数是None,那么它就成了顶级部件。
两个部件类型QTextBrowser和QLineEdit,分别是只读多文本框和单行文本框。
selectAll()选择所有文本,setFocus()方法用来固定光标。
connect()用来关联信号,信号槽和响应方法。
最后使用setWindowTitle()设置标题
窗口布局
设置部件的位置和大小主要有三种方法:
- 使用resize()、 move()等方法直接设置。
- 重写resizeEvent() 等事件进行动态设置。
- 使用布局管理器。
使用布局管理器是比较常用的方法,也可以结合这些方法一同使用。
常用的布局管理器有三种:
- 垂直布局
- 水平布局
- 网格布局
在PyQt中布局决定父子关系,在上面的例子中虽然QTextBrowser和QLineEdit没有设置parent参数,但是通过布局设置后它们都从属布局管理器,而布局管理器又从属Form类,所以当我们关闭顶级窗口时,它的所有子部件都会依次关闭。