消息盒子MessageBox 其实就是各种类型的消息对话框,如信息对话框、警告对话框、循环对话框等,主要的是对话框的图标以及按钮的个个数。 QMessageBox 类提供了若干个静态方法可以显示各种类型的对话框。例如information方法用于显示信息对话框,warning方法用于显示警告对话框,question方法用于显示循环对话框。 import sys from PyQt5.QtWidgets import QWidget,QMessageBox,QApplication class MessageBox(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setGeometry(800,600,300,300) self.setWindowTitle('消息盒子') self.show() def closeEvent(self, event): reply =QMessageBox.question(self,'消息',"你真的要退出?",QMessageBox.Yes|QMessageBox.No,QMessageBox.No) if reply == QMessageBox.Yes: event.accept() else: event.ignore() if __name__ == '__main__': app = QApplication(sys.argv) ex= MessageBox() sys.exit(app.exec_()) 面向对象的方式将与窗口县官代码都封装到MessageBox类中,这是编写PYQT5程序常用的方式,以后编写的代码都会采用这种方式 closeEvent方法窗口关闭的事件方法,当窗口关闭时,会首先调用该方法。这个方法调用是自动的,不需要干预,也不需要注册该方法。方法名必须是closeEvent closeEvent方法第2个参数是与关闭事件有关的对象,其中accept方法让窗口关闭,ignore方法方法会让取消窗口关闭动作。 窗口居中 没有提供让窗口居中的方法,根据窗口的宽度、高度以及屏幕的宽度高于计算出窗口左上角的左边,然后使用窗口对象的move方法将窗口移动到中心位置。 import sys from PyQt5.QtWidgets import QWidget,QMessageBox,QApplication,QDesktopWidget class MessageBox(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setGeometry(800,600,300,300) self.center() self.setWindowTitle('消息盒子') self.show() def closeEvent(self, event): reply =QMessageBox.question(self,'消息',"你真的要退出?",QMessageBox.Yes|QMessageBox.No,QMessageBox.No) if reply == QMessageBox.Yes: event.accept() else: event.ignore() def center(self): desktop =app.desktop() self.move((desktop.width()-self.width())/2,(desktop.height()-self.height())/2) if __name__ == '__main__': app = QApplication(sys.argv) ex= MessageBox() sys.exit(app.exec_()) 布局 支持三种布局方式 绝对布局、盒布局、网格布局 绝对布局尽管非常灵活,可以任意摆放控件的位置,但也有其局限性。 控件的位置固定,不会随着窗口尺寸的变化而变化,例如 当窗口默认尺寸控件在窗口中心时,如果窗口的尺寸改变,那么这个控件将不再处于窗口中心。 无法使用不同平台和 不同分辨率的显示器。 更改字体大小可能会破坏布局。 如果决定对应用进行重构,按摩还需要重新计算每一个控件的位置和大小。 因此绝对布局尽管非常但不适用与所有情况,如要让布局适用性更强,可以适用盒布局盒网格布局。 import sys from PyQt5.QtWidgets import QWidget,QLabel,QApplication class AbsoluteLayout(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): lbl1 =QLabel('姓名',self) lbl1.move(15,10) lbl2 =QLabel('年龄',self) lbl2.move(35,40) lbl3 =QLabel('所在城市',self) lbl3.move(55,70) self.setGeometry(300,300,250,150) self.setWindowTitle('绝对布局') self.show() if __name__ == '__main__': app =QApplication(sys.argv) ex =AbsoluteLayout() sys.exit(app.exec_()) 盒布局 盒布局分为水平盒布局盒垂直盒布局,分别用QHBoxLayout类 和QVBoxLayout类表示。水平盒布局时将控件沿水平放心摆放,垂直布局是将控件沿垂直放心摆放。 addWidget方法将控件添加到盒布局中。 盒布局对象的addLayout方法将布局对象添加到盒布局中。 先水平盒布局,让两个按钮建立一个垂直盒布局,并且将水平盒布局添加到垂直盒布局中,最后让水平盒布局始终在屏幕的下方。 import sys from PyQt5.QtWidgets import QWidget,QLabel,QApplication,QHBoxLayout,QVBoxLayout class AbsoluteLayout(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): lbl1 =QLabel('姓名',self) # lbl1.move(15,10) lbl2 =QLabel('年龄',self) # lbl2.move(35,40) lbl3 =QLabel('所在城市',self) # lbl3.move(55,70) hlbl =QHBoxLayout() hlbl.addStretch() hlbl.addWidget(lbl1) hlbl.addWidget(lbl2) # 将控件添加到水平盒布局中 hlbl.addWidget(lbl3) # 创建垂直盒布局对象 vlbl =QVBoxLayout() # 让控件始终在窗口的下方 vlbl.addStretch() # 将水平盒布局对象添加到垂直盒布局 vlbl.addLayout(hlbl) # 将垂直盒布局应用在当前窗口 self.setLayout(vlbl) self.setGeometry(300,300,250,150) self.setWindowTitle('绝对布局') self.show() if __name__ == '__main__': app =QApplication(sys.argv) ex =AbsoluteLayout() sys.exit(app.exec_()) 网格布局 网格布局 相当于一个二维表,将窗口划分未若干个行若干个列。一个控件可以摆放在一个单元格中,也可以横跨多行多列。网格布局用QGridLayout类表示。该类中常用的方法是addWidget,可以将一个控件添加到网格布局中,并指定该控件从第几行第几列开始,以及占用几行几列,还可以适用addSpacing方法指定在水平盒垂直放心单元格之间的距离。 网格布局创建一个提交数据的表单窗口,三个QLabel控件盒三个文本编辑框架QLineEdit 和QTextEdit import sys from PyQt5.QtWidgets import (QWidget,QLabel,QLineEdit,QTextEdit,QGridLayout,QApplication) class FormGridLayort(QWidget): def __init__(self): super().__init__() def initUI(self): title =QLabel('标题') author =QLabel('作者') summary = QLabel('摘要') titleEdit = QLineEdit() authorEdit =QLineEdit() summaryEdit =QLineEdit() # 创建网格布局对象 grid = QGridLayout() # 设置单元格之间的距离 grid.setSpacing(10) # 向网格布局添加title控件,位于第2行第1列 grid.addWidget(title,1,0) # 向网格布局添加titleEdit控件,位于第2行第2列 grid.addWidget(titleEdit,1,1) # 向网格布局添加author控件,位于第3行第1列 grid.addWidget(author,2,0) grid.addWidget(authorEdit,2,1) grid.addWidget( summary, 3, 0 ) grid.addWidget( summaryEdit, 3, 1,5,1 ) self.setLayout(grid) self.setGeometry(300,300,350,300) self.setWindowTitle('网格布局') self.show() if __name__ == '__main__': app = QApplication(sys.argv) ex = FormGridLayort() sys.exit(app.exec_()) ---------------------------------------------------------------------------------------------------------------------- 我们尊重原创,也注重分享,文章来源于微信公众号:单片机软件开发,建议关注公众号查看原文。如若侵权请联系qter@qter.org。 ---------------------------------------------------------------------------------------------------------------------- |