“Atom:不可再细分的最小颗粒”
——古希腊爱奥尼亚学派,留基伯
我是小白,从网上看Pyqt教程,总是感到头大。要么非常系统,好似直接把正本《初等数论》丢给你,节奏过于缓慢,专业术语太多看得头大,并且缺少实践和实验,都不懂这个组件弄出来是什么样子。如果是看案例教程,则是直接丢上一整个案例的代码,对于纯小白来说还是过于复杂,好多代码存在的原因都不知道,一头雾水。所以我决定从最基本的代码来学,本篇文章则记录我的学习过程。
宇宙大爆炸
import sys
from PyQt5.QtWidgets import QApplication
if __name__ == '__main__':
app = QApplication(sys.argv)
sys.exit(app.exec_())
运行,没有窗体弹出,没有任何反应,但是程序保持运行,不会结束,也只能通过关闭终端来强制结束程序。
这段代码导入了最基础的Pyqt中最基础的QApplication类,然后实例化了它。并通过一行“玄学代码”sys.exit(app.exec_())来让程序保持运行着,不会退出。为什么要这行代码,这行代码是怎么运作的,我也不知道。
膨胀
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication
if __name__ == '__main__':
app = QApplication(sys.argv)
qMainWindow = QMainWindow()
sys.exit(app.exec_())
运行,没有窗体弹出,没有任何反应,但是程序保持运行,不会结束,也只能通过关闭终端来强制结束程序。
这段代码导入了非常基础的QMainWindow类,并实例化了他。
冷却
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication
if __name__ == '__main__':
app = QApplication(sys.argv)
qMainWindow = QMainWindow()
qMainWindow.show()
sys.exit(app.exec_())
运行,弹出了一个非常小的窗口,程序不会自己退出,点击窗口右上角的“X”,窗体关闭,程序随后马上退出。
这段代码调用了QMainWindow的show()方法,窗体就出现了
万有引力
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication
class qmainwindow(QMainWindow):
def __init__(self):
super().__init__()
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
qMainWindow = qmainwindow()
sys.exit(app.exec_())
运行,弹出了一个非常小的窗口,程序不会自己退出,点击窗口右上角的“X”,窗体关闭,程序随后马上退出。
这段代码自己创建了一个类,继承了QMainWindow类,在类的init函数内调用了父类show方法,并实例化了它。
尘埃
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication
class qmainwindow(QMainWindow):
def __init__(self):
super().__init__()
self.resize(666, 666)
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
qMainWindow = qmainwindow()
sys.exit(app.exec_())
父类的resize方法改变了窗体大小
氢元素
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication
class qmainwindow(QMainWindow):
def __init__(self):
super().__init__()
self.resize(666, 666)
self.setWindowTitle('窗体发展历史')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
qMainWindow = qmainwindow()
sys.exit(app.exec_())
修改了窗口标题
核聚变
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication
from PyQt5.QtWidgets import QDesktopWidget
class qmainwindow(QMainWindow):
def __init__(self):
super().__init__()
self.resize(666, 666)
self.setWindowTitle('窗体发展历史')
self.frameGeometry().moveCenter(QDesktopWidget().availableGeometry().center())
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
qMainWindow = qmainwindow()
sys.exit(app.exec_())
完美的窗口居中。
产生新元素
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication
from PyQt5.QtWidgets import QDesktopWidget
class qmainwindow(QMainWindow):
def __init__(self):
super().__init__()
self.resize(666, 666)
self.setWindowTitle('窗体发展历史')
self.frameGeometry().moveCenter(QDesktopWidget().availableGeometry().center())
self.statusBar().showMessage('我的状态是:准备就绪')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
qMainWindow = qmainwindow()
sys.exit(app.exec_())
在窗体底部出现状态
万有引力和质量的平方成正比
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication
from PyQt5.QtWidgets import QDesktopWidget
class qmainwindow(QMainWindow):
def __init__(self):
super().__init__()
self.resize(666, 666)
self.setWindowTitle('窗体发展历史')
self.frameGeometry().moveCenter(QDesktopWidget().availableGeometry().center())
self.statusBar().showMessage('我的状态是:准备就绪')
self.menuBar().addMenu('文件')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
qMainWindow = qmainwindow()
sys.exit(app.exec_())
上方出现菜单,有鼠标悬浮,点击效果,非别为浅蓝色和深蓝色。点击后无反应。
球体
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication
from PyQt5.QtWidgets import QDesktopWidget, QAction
class qmainwindow(QMainWindow):
def __init__(self):
super().__init__()
self.resize(666, 666)
self.setWindowTitle('窗体发展历史')
self.frameGeometry().moveCenter(QDesktopWidget().availableGeometry().center())
self.statusBar().showMessage('我的状态是:准备就绪')
wenJian = self.menuBar().addMenu('文件')
addNewFile = QAction('新建文件', self)
wenJian.addAction(addNewFile)
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
qMainWindow = qmainwindow()
sys.exit(app.exec_())
现在点击文件,能出现“新建文件”选项,并且也存在鼠标悬浮和点击特效。
气态?液态?固态?范德华力。温度。
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication
from PyQt5.QtWidgets import QDesktopWidget, QAction
class qmainwindow(QMainWindow):
def __init__(self):
super().__init__()
self.resize(666, 666)
self.setWindowTitle('窗体发展历史')
self.frameGeometry().moveCenter(QDesktopWidget().availableGeometry().center())
self.statusBar().showMessage('我的状态是:准备就绪')
wenJian = self.menuBar().addMenu('文件')
addNewFile = QAction('新建文件', self)
addNewFile.triggered.connect(self.doSomething)
wenJian.addAction(addNewFile)
self.show()
def doSomething(self):
print("doSomething!")
if __name__ == '__main__':
app = QApplication(sys.argv)
qMainWindow = qmainwindow()
sys.exit(app.exec_())
突然代码多了起来。对刚刚新建的action绑定了事件“doSomething”,可以看到在点击了文件-新建文件后,控制台打印出了doSomething!
元素周期表
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication
from PyQt5.QtWidgets import QDesktopWidget, QAction, QMenu
class qmainwindow(QMainWindow):
def __init__(self):
super().__init__()
self.resize(666, 666)
self.setWindowTitle('窗体发展历史')
self.frameGeometry().moveCenter(QDesktopWidget().availableGeometry().center())
self.statusBar().showMessage('我的状态是:准备就绪')
wenJian = self.menuBar().addMenu('文件')
addNewFile = QAction('新建文件', self)
addNewFile.triggered.connect(self.doSomething)
wenJian.addAction(addNewFile)
output = QMenu('导出', self)
wenJian.addMenu(output)
self.show()
def doSomething(self):
print("doSomething!")
if __name__ == '__main__':
app = QApplication(sys.argv)
qMainWindow = qmainwindow()
sys.exit(app.exec_())
继续
恒星?行星?
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication
from PyQt5.QtWidgets import QDesktopWidget, QAction, QMenu
class qmainwindow(QMainWindow):
def __init__(self):
super().__init__()
self.resize(666, 666)
self.setWindowTitle('窗体发展历史')
self.frameGeometry().moveCenter(QDesktopWidget().availableGeometry().center())
self.statusBar().showMessage('我的状态是:准备就绪')
wenJian = self.menuBar().addMenu('文件')
addNewFile = QAction('新建文件', self)
addNewFile.triggered.connect(self.doSomething)
wenJian.addAction(addNewFile)
output = QMenu('导出', self)
outputAsPNG = QAction('导出为PNG', self)
outputAsJPG = QAction('导出为JPG', self)
output.addAction(outputAsPNG)
output.addAction(outputAsJPG)
wenJian.addMenu(output)
self.show()
def doSomething(self):
print("doSomething!")
if __name__ == '__main__':
app = QApplication(sys.argv)
qMainWindow = qmainwindow()
sys.exit(app.exec_())
标题逐渐正常,setStatusTip
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication
from PyQt5.QtWidgets import QDesktopWidget, QAction, QMenu
class qmainwindow(QMainWindow):
def __init__(self):
super().__init__()
self.resize(666, 666)
self.setWindowTitle('窗体发展历史')
self.frameGeometry().moveCenter(QDesktopWidget().availableGeometry().center())
self.statusBar().showMessage('我的状态是:准备就绪')
wenJian = self.menuBar().addMenu('文件')
addNewFile = QAction('新建文件', self)
addNewFile.triggered.connect(self.doSomething)
wenJian.addAction(addNewFile)
output = QMenu('导出', self)
outputAsPNG = QAction('导出为PNG', self)
outputAsPNG.setStatusTip('这是StatusTip')
outputAsJPG = QAction('导出为JPG', self)
output.addAction(outputAsPNG)
output.addAction(outputAsJPG)
wenJian.addMenu(output)
self.show()
def doSomething(self):
print("doSomething!")
if __name__ == '__main__':
app = QApplication(sys.argv)
qMainWindow = qmainwindow()
sys.exit(app.exec_())
checkable
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication
from PyQt5.QtWidgets import QDesktopWidget, QAction, QMenu
class qmainwindow(QMainWindow):
def __init__(self):
super().__init__()
self.resize(666, 666)
self.setWindowTitle('窗体发展历史')
self.frameGeometry().moveCenter(QDesktopWidget().availableGeometry().center())
self.statusBar().showMessage('我的状态是:准备就绪')
wenJian = self.menuBar().addMenu('文件')
addNewFile = QAction('新建文件', self)
addNewFile.triggered.connect(self.doSomething)
wenJian.addAction(addNewFile)
output = QMenu('导出', self)
outputAsPNG = QAction('导出为PNG', self, checkable=True)
outputAsPNG.setStatusTip('这是StatusTip')
outputAsPNG.setChecked(True)
outputAsJPG = QAction('导出为JPG', self)
output.addAction(outputAsPNG)
output.addAction(outputAsJPG)
wenJian.addMenu(output)
self.show()
def doSomething(self):
print("doSomething!")
if __name__ == '__main__':
app = QApplication(sys.argv)
qMainWindow = qmainwindow()
sys.exit(app.exec_())
写到这,可以详细查看https://cloud.tencent.com/developer/article/1907004