平时应该多看文档
http://pyqt.sourceforge.net/Docs/PyQt5/index.html
本学习系列参考http://www.cnblogs.com/archisama/p/5442071.html记录个人学习心得,参考的链接翻译自英文原版教程http://zetcode.com/gui/pyqt5/,以后不重复说明.
代码如下:
#coding=utf-8
import sys
from PyQt5.QtWidgets import QApplication, QWidget
def main1():
app = QApplication(sys.argv)
widget = QWidget()
widget.resize(500, 400)
widget.move(300, 0)
widget.setWindowTitle('第一个程序')
widget.show()
sys.exit(app.exec_())
pass
if __name__ == '__main__':
main1()
在Qt里所有能显示的都是QWidget的子类,如下定义了一个QWidget对象,然后调用resize改变大小,move改变位置,然后设置标题,最后调用show显示。通过app.exec_()
进入应用程序的消息循环队列。显示效果如下图所示
QIcon的C++文档参见https://doc.qt.io/qt-5/qicon.html
接下来我们在QWidget显示的基础上,用面向对象的思路介绍QIcon的使用,在标题栏的左上角显示一个小图片.说白了就是在一个QWidget的左上角显示个图片.
代码如下:
#coding=utf-8
import sys
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtGui import QIcon
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setGeometry(200, 200, 500, 400)
self.setWindowTitle('Widget左上角设图片')
# self.setWindowIcon(QIcon('icon.ico'))
self.show()
pass
def main2():
app = QApplication(sys.argv)
app.setWindowIcon(QIcon('icon.ico'))
example = Example()
sys.exit(app.exec_())
pass
if __name__ == '__main__':
main2()
这里跟第一个例子没有太多区别,就是继承QWidget,写了个initUI函数.其中的setGeometry
等于上面的move+resize,前两个参数是窗口左上角相对于屏幕左上角的(x,y)坐标值。后两个参数是窗口的宽度和高度.效果如下:
注意事项
setWindowIcon
,但是在mac上没有效果。后来查到调QApplication的setWindowIcon
也可以达到效果。不知道是不是这两个平台的差异。任何QWidget都可以设置类似气泡的提示,通过函数setToolTip
.
源码如下:
#coding=utf-8
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QToolTip
from PyQt5.QtGui import QIcon, QFont
class Example2(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
QToolTip.setFont(QFont('SansSerif', 30))
self.setGeometry(200, 200, 400, 400)
self.setWindowTitle('第三个例子-气泡提示')
self.setToolTip('这是第三个例子')
btn = QPushButton('点击吧', self)
btn.setToolTip('按钮啊我是哈哈')
btn.resize(btn.sizeHint())
btn.move(50, 50)
self.show()
pass
def main3():
app = QApplication(sys.argv)
example = Example2()
sys.exit(app.exec_())
if __name__ == '__main__':
main3()
注意,核心有两点
QToolTip.setFont()
设置提示的字体大小setToolTip()
设置提示文字内容QPushButton(const QString &text, QWidget *parent = Q_NULLPTR)
第一个是文字内容,第二个是它的父类。QPushButton API介绍
我们现在所有显示的例子都是QWidget,事实上qt的显示是分层的。没有父类的组件就是顶级窗口,其余的都要有父类。
下面继续介绍点击QPushButton
,让整个程序退出的方法,也就是QCoreApplication.instance().quit
的使用。
#coding=utf-8
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QToolTip
from PyQt5.QtGui import QIcon, QFont
from PyQt5.QtCore import QCoreApplication
class Example3(QWidget):
def __init__(self):
super().__init__()
self.initUI()
pass
def initUI(self):
self.setGeometry(300, 300, 450, 450)
self.setWindowTitle('点击按钮关闭demo')
btn = QPushButton('关闭', self)
btn.resize(btn.sizeHint())
btn.move(30, 30)
QToolTip.setFont(QFont('SansSerif', 30))
btn.setToolTip('点击退出程序')
btn.clicked.connect(QCoreApplication.instance().quit)
self.show()
pass
def main4():
app = QApplication(sys.argv)
example = Example3()
sys.exit(app.exec_())
if __name__ == '__main__':
main4()
注意事项
btn.clicked.connect()
.Qt里是信号与槽的机制,clicked就是信号,connect里面传的就是槽。点击后发送者是按钮,接收者是对象。QCoreApplication.instance().quit
quit
而不是quit()
,因为接受者是对象。MessageBox
就类似Android里的各种AlertDialog
对话框。
class Example3(QWidget):
def __init__(self):
super().__init__()
self.initUI()
pass
def initUI(self):
self.setGeometry(300, 300, 400, 400)
self.setWindowTitle('MessageBox的使用')
self.show()
pass
def closeEvent(self, event):
reply = QMessageBox.question(self, 'Message', '你确认要退出么?', QMessageBox.Yes|QMessageBox.No, QMessageBox.No)
if reply == QMessageBox.Yes:
event.accept()
else:
event.ignore()
pass
def main5():
app = QApplication(sys.argv)
example = Example3()
sys.exit(app.exec_())
if __name__ == '__main__':
main4()
显示效果如下所示
当关闭一个QWidget时,QCloseEvent事件就会产生,自动进入到closeEvent函数里。
reply = QMessageBox.question(self, 'Message', '你确认要退出么?', QMessageBox.Yes|QMessageBox.No, QMessageBox.No)
上面这句代码是调QMessageBox的静态方法显示一个QMessageBox。一个参数传的是父类,第二个参数是title,第三个参数显示文本内容,第四个参数是按钮的集合,第五个参数是默认选中哪个按钮。
最后的event.accept()
,表示允许处理这个事件,也就是执行关闭操作.
#coding=utf-8
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QToolTip, QMessageBox, QDesktopWidget
from PyQt5.QtGui import QIcon, QFont
from PyQt5.QtCore import QCoreApplication
class Example3(QWidget):
def __init__(self):
super().__init__()
self.initUI()
pass
def initUI(self):
self.resize(400, 400)
self.center()
self.setWindowTitle('QWidget居中demo')
self.show()
pass
def center(self):
fg = self.frameGeometry()
cp = QDesktopWidget().availableGeometry().center()
fg.moveCenter(cp)
self.move(fg.topLeft())
pass
def main5():
app = QApplication(sys.argv)
example = Example3()
sys.exit(app.exec_())
if __name__ == '__main__':
main5()
注意事项
center
函数让其居中;self.frameGeometry()
取出当前widget的坐标。一个Geometry
信息包含左上顶点的xy坐标以及width和height。这点搞过android的都不陌生吧。QDesktopWidget().availableGeometry().center()
获得当前电脑屏幕的中心点。然后让widget的Geometry
也改变中心点。之后self.move(qr.topLeft())
就可以了。