PyQt5之QMainWindow
如果一个窗口包含一个或多个窗口,那么这个窗口就是父窗口,被包含的窗口则是子窗口。没有父窗口的窗口就是顶层窗口,
QMainWindow
就是一个顶层窗口,它可以包含很多界面元素,如菜单栏、工具栏、状态栏、子窗口等。
QMainWindow
继承自QWidget类,拥有它的所有派生方法和属性,比较重要的方法如下:
方法 | 描述 |
---|---|
addToolBar() | 添加工具栏 |
centralWidget() | 返回窗口中心的一个控件,未设置时返回NULL |
menuBar() | 返回主窗口的菜单栏 |
setCentralWidget() | 设置窗口中心的控件 |
setStatusBar() | 设置状态栏 |
statusBar() | 获得状态栏对象后,调用状态栏对象的showMessage(message,int timeout=0)方法,显示状态栏信息。其中第一个参数是要显示的状态栏信息,第二个参数是信息停留的时间,单位是毫秒(ms),默认是0,表示一直显示状态栏信息。 |
注:QMainWindow
不能设置布局(使用setLayout()方法),因为它有自己的布局。
一、创建主窗口
import sys
from PyQt5.QtWidgets import QMainWindow,QApplication
class MainWindow(QMainWindow):
def __init__(self):
super(MainWindow,self).__init__()
self.setWindowTitle("第一个主窗口")
self.resize(400,400)
self.status = self.statusBar()
self.status.showMessage("这是状态栏",5000)
if __name__ == "__main__":
app = QApplication(sys.argv)
form = MainWindow()
form.show()
sys.exit(app.exec_())
代码分析:
- 在自定义的窗口类 MainWindow 中,继承了主窗口 QMainWindow 类所有的属性和方法,然后使用父类的构造函数 super() 初始化窗口;
- 通过 setWindowTitle() 方法设置窗口标题,resize() 方法设置窗口大小;
- 使用QMainWindow 类的 statusBar() 方法创建状态栏,然后调用;showMessage() 方法将提示信息显示在状态栏,显示时间为5秒,5秒之后状态栏提示信息消失。
二、主窗口居中
利用 QDesktopWidget 类来实现主窗口居中显示,代码如下:
import sys
from PyQt5.QtWidgets import QMainWindow,QApplication,QDesktopWidget
class MainWindow(QMainWindow):
def __init__(self):
super(MainWindow,self).__init__()
self.resize(400,400)
self.setWindowTitle("第二个主窗口")
self.center()
def center(self):
screen = QDesktopWidget().screenGeometry()
size = self.geometry()
self.move(int((screen.width()-size.width())/2),int((screen.height()-size.height())/2))
if __name__ == "__main__":
app = QApplication(sys.argv)
form = MainWindow()
form.show()
sys.exit(app.exec_())
代码分析:
- QDesktopWidget().screenGeometry() 用来计算显示屏幕的大小,QDesktopWidget是描述显示屏幕的类,通过 screenGeometry() 来获得屏幕的大小;
- self.geometry() 是用来获取主窗口的大小;
- self.move() 用来移动主窗口,里面的参数即为屏幕中心的位置坐标,如果出现
DeprecationWarning: an integer is required (got type float)
警告,则将里面的参数进行取整即可。
三、关闭主窗口
import sys
from PyQt5.QtWidgets import QMainWindow,QApplication,QDesktopWidget,QPushButton
class MainWindow(QMainWindow):
def __init__(self):
super(MainWindow,self).__init__()
self.resize(400,400)
self.setWindowTitle("第二个主窗口")
button = QPushButton("关闭主窗口",self)
button.move(100,200)
button.clicked.connect(self.close)
if __name__ == "__main__":
app = QApplication(sys.argv)
form = MainWindow()
form.show()
sys.exit(app.exec_())
代码分析:
- QPushButton(str,QWidget) 创建一个按钮对象添加到主窗口中;
- button.clicked.connect(self.close) 连接槽函数,当按钮被点击时调用close()函数,使主窗口关闭。