第一课链接
参考资料
第二课实现了菜单栏、工具栏、状态栏、文本编辑框
效果:
代码及注释:
from PyQt5.QtWidgets import QApplication,QWidget,QToolTip,QPushButton,QMessageBox,QDesktopWidget
from PyQt5.QtWidgets import QMainWindow,QAction,qApp,QMenu,QTextEdit
from PyQt5.QtGui import QIcon,QFont#创建应用图标
#构造一个 Qt core 应用程序。core 应用程序是没有图形用户界面的应用程序。此类应用程序用于控制台或服务器进程。
from PyQt5.QtCore import QCoreApplication
import sys
#创建了一个很经典的菜单框架,有右键菜单,工具栏和状态栏。
class App1(QMainWindow):
def __init__(self):#构造函数,实例初始化
#调用了两个构造器,一个是这个类本身的,一个是这个类继承的
super().__init__()#super()构造器方法返回父级的对象
self.initUI()#每个对象创建后都会执行这个函数
def initUI(self):
#创建一个文本编辑区域
textEdit = QTextEdit()
self.setCentralWidget(textEdit)
QToolTip.setFont(QFont('SansSerif', 10))
# self.statusBar().showMessage('Ready')#状态栏
self.statusbar = self.statusBar()
self.statusbar.showMessage('Ready')
#退出
exitAct = QAction(QIcon('exit.png'), '&Exit', self)#QAction是菜单栏、工具栏或者快捷键的动作的组合
exitAct.setShortcut('Ctrl+Q')#设置快捷键退出应用
exitAct.setStatusTip('Exit application')#状态
#这个行为被触发的时候,会调用QtGui.QMainWindow的quit方法退出应用。
exitAct.triggered.connect(qApp.quit)
#创建一个工具栏,里面只有一个退出的工具
#工具栏就是常用的命令的集合
self.toolbar = self.addToolBar('Exit')
self.toolbar.addAction(exitAct)
#当执行这个指定的动作时,就触发了一个事件。这个事件跟QApplication的quit()行为相关联,
# 所以这个动作就能终止这个应用。
menubar = self.menuBar()#菜单栏
menubar.setNativeMenuBar(False)#mac下需加此语句才能正常显示菜单栏
fileMenu = menubar.addMenu('&File')#用addMenu()在上面添加了一个file菜单
fileMenu.addAction(exitAct)#addAction()关联了点击退出应用的事件。
#创建了一个行为菜单。这个行为/动作能切换状态栏显示或者隐藏
viewMenu = menubar.addMenu('View')
viewStatAct = QAction('View statusbar', self, checkable=True)
viewStatAct.setStatusTip('View statusbar')
viewStatAct.setChecked(True)
viewStatAct.triggered.connect(self.toggleMenu)
viewMenu.addAction(viewStatAct)
#添加子菜单:文件->导入文件->导入mail
impMenu = QMenu('Import', self)#子菜单
impAct = QAction('Import mail', self)
impAct.setStatusTip('导入文件')
impMenu.addAction(impAct)
fileMenu.addMenu(impMenu)#把动作添加到菜单里
##添加子菜单:文件->新建
newAct = QAction('New', self)
newAct.setStatusTip('新建工程')
fileMenu.addAction(newAct)
self.setGeometry(300, 300, 300, 220)#相当于resize和move方法的合体
self.setWindowTitle('带Icon的窗体')
self.center()#自定义的函数,把窗口挪到中间
self.show()#一个没有父对象的控件默认不显示,必须调用show才可以显示
#消息盒子
def closeEvent(self, event):
#参数按顺序分别是(忽略self),标题栏显示的信息,对话框内显示的信息
# 消息框内的两个按钮,默认选中的按钮(可以看到这里默认选否)
reply = QMessageBox.question(self, 'Message',
"Are you sure to quit?", QMessageBox.Yes |
QMessageBox.No, QMessageBox.No)
if reply == QMessageBox.Yes:
event.accept()#点击是 则退出程序,接受该信号(退出程序)
else:
event.ignore()#点击否 忽略该信号
def toggleMenu(self, state):
if state:
self.statusbar.show()
else:
self.statusbar.hide()
#程序放在屏幕中央
def center(self):
qr = self.frameGeometry()#获得主窗口所在的框架。
#QDesktopWidget提供了用户的桌面信息,包括屏幕的大小。
cp = QDesktopWidget().availableGeometry().center()#获取显示器的分辨率,然后得到屏幕中间点的位置。
print(cp)
#通过move函数把主窗口的左上角移动到其框架的左上角,这样就把窗口居中了。
qr.moveCenter(cp)
self.move(qr.topLeft())
if __name__ == '__main__':
#当别人通过命令行启动此程序时,通过接收命令行传递的参数实现不同的业务逻辑
app = QApplication(sys.argv)
ex = App1()
app.setWindowIcon(QIcon('app.ico'))
#保证程序不会退出,进入消息循环,使得代码在运行到这个位置时不会结束
sys.exit(app.exec_())#可以返回程序退出码,帮助我们判断程序退出的原因