QMainWindow和QWidget
一、QMainWindow
QmainWindow主窗口为用户提供一个应用程序框架,它有自己的布局,可以在布局中添加控件。在主窗口中可以添加控件,比如将工具栏、菜单栏、状态栏等添加到布局管理器中。
窗口类型介绍:QMainWindow、QWidget、QDialog三个类都可以用来创建窗口,可以直接使用,也可以继承后使用。
QMainWindow窗口包含菜单栏、工具栏、状态栏、标题栏等,是最常见的窗口形式,也可以说是GUI程序的主窗口。
QDialog是对话框窗口的基类。对话框主要用来执行短期任务,或者与用户进行互动,它可以是模态的,也可以是非模态的。他没有菜单栏、工具栏、状态栏等。
如果是主窗口,就使用QMainWindow类;
如果是对话框,就使用QDialog类;
如果不确定,有可能作为顶层窗口,也有可能嵌入到其他窗口,就使用QWidget类。
QMainWindow类中比较重要的方法:
方法 | 描述 |
addToolBar() |
添加工具栏 |
centralWidget() | 返回窗口中心的一个控件,未设置时返回None |
menuBar() | 返回主窗口的菜单栏 |
setCentralWidget() | 设置窗口中心的控件 |
setstatusBar() | 设置状态栏 |
statusBar() | 获得状态栏对象后,调用状态栏对象的showMessage(message,int timeout = 0)方法,显示状态栏信息。第一个参数是要显示的信息,第二个参数是信息停留的时间,单位是ms,默认值为0,表示一直显示状态栏信息。 |
QmainWindow有自己的布局,它不能再设置布局了
1、创建主窗口
1 import sys 2 from PyQt5.QtWidgets import QMainWindow, QApplication 3 from PyQt5.QtGui import QIcon 4 5 class MainWindow(QMainWindow): 6 def __init__(self, parent = None): 7 super(MainWindow, self).__init__(parent) 8 self.resize(400, 200) 9 self.status = self.statusBar() 10 self.status.showMessage('这是状态栏显示', 5000) 11 self.setWindowTitle('PyQt MainWindow例子') 12 13 14 if __name__ == '__main__': 15 app = QApplication(sys.argv) 16 app.setWindowIcon(QIcon(r'F:\火狐浏览器下载的文件\test.jpg')) 17 form = MainWindow() 18 form.show() 19 sys.exit(app.exec_())
结果:
注意这里状态栏信息会显示5秒(代码里面设置了5秒)
2、主窗口居中显示
1 from PyQt5.QtWidgets import QDesktopWidget, QApplication, QMainWindow 2 import sys 3 4 class winform(QMainWindow): 5 def __init__(self, parent = None): 6 super(winform, self).__init__(parent) 7 self.setWindowTitle('主窗口放在屏幕中间的例子') 8 self.resize(400, 200) 9 self.center() 10 11 def center(self): 12 screen = QDesktopWidget().screenGeometry() #计算显示屏的尺寸 13 size = self.geometry() #计算qwidget的窗口大小 14 self.move((screen.width() - size.width()) / 2, (screen.height() - size.height()) / 2) #把窗口移动到屏幕正中央 15 16 if __name__ == '__main__': 17 app = QApplication(sys.argv) 18 win = winform() 19 win.show() 20 sys.exit(app.exit(app.exec_()))
结果:
在这里使用了QDeskWidget类用来显示计算机显示屏的一些参数信息。然后调用move函数将窗体移动到屏幕正中央。
3、关闭主窗口
1 from PyQt5.QtWidgets import QApplication, QWidget, QMainWindow, QPushButton, QHBoxLayout 2 import sys 3 4 class winform(QMainWindow): 5 def __init__(self, parent = None): 6 super(winform, self).__init__(parent) 7 self.setWindowTitle('关闭主窗口例子') 8 self.button1 = QPushButton('关闭主窗口1') 9 # self.button2 = QPushButton('关闭主窗口2') 10 self.button1.clicked.connect(self.onButtonClick) #绑定动作函数 11 # self.button2.clicked.connect(self.onButtonClick) #绑定动作函数 12 13 layout = QHBoxLayout() 14 layout.addWidget(self.button1) 15 # layout.addWidget(self.button2) 16 17 main_frame = QWidget() 18 main_frame.setLayout(layout) 19 self.setCentralWidget(main_frame) 20 21 def onButtonClick(self): 22 #sender是发送信号的对象,此处发送信号的对象是button1按钮 23 sender = self.sender() 24 print(sender.text() + '被按下了') 25 qApp = QApplication.instance() 26 qApp.quit() 27 28 if __name__ == '__main__': 29 app = QApplication(sys.argv) 30 form = winform() 31 form.show() 32 sys.exit(app.exec_())
结果:
这里在主窗口上面添加了一个Button按钮控件,并将其绑定到onButtonClick函数上面。当按下按钮的时候,会调用onButtonClick函数,该函数里面又调用了quit函数。主窗口退出。
二、QWidget
基础窗口控件QWidget类是所有用户界面对象的基类,所有窗口或者控件都直接或间接继承自QWidget类。
1、QWidget不包含边框的常用函数
- 改变用户区的面积:
QWidget.resize(width, height) QWidget.resize(Qsize)
- 获得用户区的大小:
QWidget.size()
- 获得用户区的宽度和高度:
QWidget.width() QWidget.height()
- 设置客户区的高度、宽度、和面积(形成的窗体不可以使用鼠标来改变大小)
QWidget.setFixedHeight() QWidget.setFixedWidth() QWidget.setFixedSize()
-
设置客户区的大小和位置:
Qwidget.setGeometry(int x, int y, int width, int height)#位置和大小
2、QWidget包含边框的常用函数
- 获得窗体的大小和位置
QWidget.frameGeometry()
- 设置窗口的位置
QWiget.move(int x, int y)
- 获得窗口左上角的的坐标
QWidget.pos()
3、屏幕坐标系统显示
1 from PyQt5.QtWidgets import QWidget, QApplication, QPushButton 2 import sys 3 4 app = QApplication(sys.argv) 5 widget = QWidget() 6 btn = QPushButton(widget) 7 btn.setText("Button") 8 9 #以QWidget左上角为(0, 0)点 10 btn.move(20, 20) 11 12 widget.resize(300, 200) #设置窗口的大小 13 widget.move(250, 200) #设置窗口的位置 以显示屏作为标准 14 15 widget.setWindowTitle('PyQt坐标系统例子') 16 widget.show() 17 print('QWidget:') 18 print('w.x() = %d'%widget.x()) #窗体的位置 19 print('w.y() = %d'%widget.y()) 20 print('w.width() = %d'%widget.width()) #窗体的尺寸 21 print('w.height() = %d'%widget.height()) 22 print('QWidget.geometry') 23 print('widget.geometry().x() = %d'%widget.geometry().x()) #窗体用户区(即不包含边框)的位置 24 print('widget.geometry().y() = %d'%widget.geometry().y()) 25 print('widget.geometry().width() = %d'%widget.geometry().width()) #窗体用户区(即不包含边框)的位置 26 print('widget.geometry().height() = %d'%widget.geometry().height()) 27 28 sys.exit(app.exec_())
结果:
4、建立一个主窗口
import sys from PyQt5.QtWidgets import QApplication, QWidget app = QApplication(sys.argv) window = QWidget() window.resize(300, 200) window.move(250, 150) window.setWindowTitle('hello PyQT5') window.show() sys.exit(app.exec_())
结果:
5、设置程序图标
1 import sys 2 from PyQt5.QtWidgets import QApplication, QWidget 3 from PyQt5.QtGui import QIcon 4 5 class Icon(QWidget): 6 def __init__(self, parent = None): 7 super(Icon, self).__init__(parent) 8 self.initUI() 9 10 def initUI(self): 11 self.setGeometry(300, 300, 1250, 150) 12 self.setWindowTitle('程序图标') 13 self.setWindowIcon(QIcon(r'F:\火狐浏览器下载的文件\test.jpg')) 14 15 if __name__ == '__main__': 16 app = QApplication(sys.argv) 17 icon = Icon() 18 icon.show() 19 sys.exit(app.exec_())
结果:
6、显示气泡提示信息
1 import sys 2 from PyQt5.QtWidgets import QApplication, QWidget, QToolTip 3 from PyQt5.QtGui import QFont 4 5 class winform(QWidget): 6 def __init__(self): 7 super().__init__() 8 self.initUI() 9 10 def initUI(self): 11 QToolTip.setFont(QFont('SansSerif', 10)) 12 self.setToolTip('这是一个<b>气泡提示</b>') 13 self.setGeometry(200, 300, 400, 400) 14 self.setWindowTitle('气泡提示demo') 15 16 if __name__ == '__main__': 17 app = QApplication(sys.argv) 18 win = winform() 19 win.show() 20 sys.exit(app.exec_())
结果:
当鼠标放置在窗体上时候,会出现该气泡提示。