信号与槽
《快速掌握PyQt5》第二章 信号与槽——裁判鸣枪与选手开跑 - 知乎
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton
class Demo(QWidget): # 1
def __init__(self):
super(Demo, self).__init__()
self.button = QPushButton('Start', self) # 2
self.button.clicked.connect(self.change_text) # 3
def change_text(self):
print('change text')
self.button.setText('Stop') # 4
self.button.clicked.disconnect(self.change_text) # 5
if __name__ == '__main__':
app = QApplication(sys.argv)
demo = Demo() # 6
demo.show() # 7
sys.exit(app.exec_())
消息框QMessageBox
《快速掌握PyQt5》第四章 QMessageBox消息框 - 知乎
information 信息框;question 问答框; warning 警告框; critical 错误框; about 关于框( 其实还有一个aboutQt框,是专门用来展示Qt软件信息的,这里不再讲述)。
登录界面
QPushButton
- 按钮有标记和非标记两种状态,这两种状态下的按钮显示的样子不同。通过setCheckable(True)方法可以将按钮设置为一个可标记的按钮,那此时该按钮就拥有了标记和非标记两种状态了。可以通过isCheckable()方法来判断该按钮是否是可标记的;
- 通过setIcon()方法给按钮设置一个图标,传入的参数为QIcon();
显示图标按钮QToolButton
QToolButton是与工具操作相关的按钮,通常和QToolBar搭配使用。QToolButton一般不用来显示文本,而显示图标QIcon(关于QToolBar我们会在后续介绍QMainWindow的时候再详细讲解)。
请注意不能在QToolButton实例化的时候直接传入文本字符串,因为该控件没有相应的初始化函数。也就是说这样做是错误的:self.test_button = QToolButton('Test', self) 如果要设置文本的话得通过setText()方法。但是setText()方法和setIcon()方法都使用的话,只会显示图标。
多选一QRadioButton
复选框QCheckBox
下拉选择框QCombox
《快速掌握PyQt5》第八章 下拉选择框QCombox和数字调节框QSpinBox - 知乎
数字调节框QSpinBox
《快速掌握PyQt5》第八章 下拉选择框QCombox和数字调节框QSpinBox - 知乎
日历控件QCalendarWidget
《快速掌握PyQt5》第十二章 与日期时间相关的控件 - 知乎
时间数字调整QDateTimeEdit
《快速掌握PyQt5》第十二章 与日期时间相关的控件 - 知乎
学会使用文档Qt Assistant
《快速掌握PyQt5》第十三章 学会使用文档——Qt Assistant - 知乎
快速制作界面Qt Designer
《快速掌握PyQt5》第十四章 快速制作界面——Qt Designer - 知乎
组合框QGroupBox
《快速掌握PyQt5》第十五章 组合框QGroupBox和工具箱QToolBox - 知乎
工具箱QToolBox
《快速掌握PyQt5》第十五章 组合框QGroupBox和工具箱QToolBox - 知乎
窗口关闭事件closeEvent
鼠标事件
mouseMoveEvent、mousePressEvent、mouseReleaseEvent、mouseDoubleClickEvent
键盘事件
keyPressEvent、keyReleaseEvent
拖放
拖放分为拖动和放下两个动作,它们涉及到以下事件:
DragEnterEvent: 所拖动目标进入接收该事件的窗口或控件时触发;
DragMoveEvent: 所拖动目标进入窗口或控件后,继续被拖动时触发;
DragLeaveEvent: 所拖动目标离开窗口或控件时触发;
DropEvent: 所拖动目标被放下时触发。
剪贴板
通常我们在Windows或Linux上使用复制都是按ctrl+c然后按ctrl+v进行粘贴(Mac上为command+c和command+v),这其中就涉及到了剪贴板,当进行复制时,其实是将要复制的内容放到了一个无形的剪贴板上,要粘贴时,再将剪贴板上的内容放到界面上。
首先通过mimeData()方法获取剪贴板内容的MIME类型,然后判断mime类型是否为text/plain,是的话则通过text()方法获取,并设为text_browser文本。
当然以上只是针对文本内容,当然还可以复制图片等文件,而剪贴板当然也有相应的方法,以下列出常用的:
列表控件QListWidget
《快速掌握PyQt5》第十九章 列表控件、树形控件、表格控件 - 知乎
树形控件QTreeWidget
《快速掌握PyQt5》第十九章 列表控件、树形控件、表格控件 - 知乎
表格控件QTableWidget
《快速掌握PyQt5》第十九章 列表控件、树形控件、表格控件 - 知乎
颜色对话框QColorDialog
字体对话框QFontDialog
输入对话框QInputDialog\QLineEdit
文件对话框QFileDialog
打印对话框QPrintDialog
主窗口QMainWindow(记事本应用)
《快速掌握PyQt5》第二十三章 主窗口QMainWindow - 知乎
拆分窗口QSplitter
选项卡控件QTabWidget
堆栈窗口QStackedWidget
停靠控件QDockWidget
看过第二十三章的小伙伴应该知道了QDockWidget是要和QMainWindow一起搭配使用的。我们再次放上这张图:
容纳多文档窗口(多子窗口)QMdiArea, QMdiSubWindow
数据库
多线程
当在执行某些复杂且耗时的操作时,我们不能将该操作放在界面控制线程中(即UI线程,就是app.exec_()所在的线程),否则我们会发现界面停止响应(或卡顿)。
QThread类
要实现多线程,我们要先继承QThread类并重新实现其中的run()函数,也就是说把耗时的操作放入run()函数中。
import sys
from PyQt5.QtCore import Qt, QThread, pyqtSignal
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QLabel, QHBoxLayout, QVBoxLayout
class Demo(QWidget):
def __init__(self):
super(Demo, self).__init__()
self.button = QPushButton('Start', self)
self.button.clicked.connect(self.count_func)
self.button_2 = QPushButton('Stop', self) # 3
self.button_2.clicked.connect(self.stop_count_func)
self.label = QLabel('0', self)
self.label.setAlignment(Qt.AlignCenter)
self.my_thread = MyThread()
self.my_thread.my_signal.connect(self.set_label_func)
self.h_layout = QHBoxLayout()
self.v_layout = QVBoxLayout()
self.h_layout.addWidget(self.button)
self.h_layout.addWidget(self.button_2)
self.v_layout.addWidget(self.label)
self.v_layout.addLayout(self.h_layout)
self.setLayout(self.v_layout)
def count_func(self):
self.my_thread.is_on = True # 5
self.my_thread.start()
def set_label_func(self, num):
self.label.setText(num)
def stop_count_func(self): # 4
self.my_thread.is_on = False
self.my_thread.count = 0
class MyThread(QThread):
my_signal = pyqtSignal(str)
def __init__(self):
super(MyThread, self).__init__()
self.count = 0
self.is_on = True # 1
def run(self):
while self.is_on: # 2
print(self.count)
self.count += 1
self.my_signal.emit(str(self.count))
self.sleep(1)
if __name__ == '__main__':
app = QApplication(sys.argv)
demo = Demo()
demo.show()
sys.exit(app.exec_())
简单爬虫实战
import sys
import urllib.request
from PyQt5.QtCore import Qt, QThread, pyqtSignal
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QLabel, QVBoxLayout
class Demo(QWidget):
def __init__(self):
super(Demo, self).__init__()
self.button = QPushButton('Start', self)
self.button.clicked.connect(self.start_func)
self.label = QLabel('Ready to do', self)
self.label.setAlignment(Qt.AlignCenter)
self.crawl_thread = CrawlThread()
self.crawl_thread.status_signal.connect(self.status_func)
self.v_layout = QVBoxLayout()
self.v_layout.addWidget(self.label)
self.v_layout.addWidget(self.button)
self.setLayout(self.v_layout)
def start_func(self):
self.crawl_thread.start()
def status_func(self, status):
self.label.setText(status)
class CrawlThread(QThread):
status_signal = pyqtSignal(str)
def __init__(self):
super(CrawlThread, self).__init__()
def run(self):
self.status_signal.emit('Crawling')
response = urllib.request.urlopen('https://www.python.org')
self.status_signal.emit('Saving')
with open('python.txt', 'w') as f:
f.write(response.read().decode('utf-8'))
self.status_signal.emit('Done')
if __name__ == '__main__':
app = QApplication(sys.argv)
demo = Demo()
demo.show()
sys.exit(app.exec_())
QSS
基本规则、选择器类型、子控件、伪状态、
国际化(语言的切换)
网页交互QWebEngineView
《快速掌握PyQt5》第三十章 网页交互QWebEngineView - 知乎
绘图与打印
绘图操作通常在paintEvent()事件函数中完成。在该函数中,我们一般会先对画笔、画刷或者字体进行设置然后再调用相关方法进行绘制。
音频QSound和QSoundEffect、QMediaPlayer
视频QMovie、QMediaPlayer
图形视图框架QGraphicsItem图元类、QGraphicsScene场景类和QGraphicsView视图类
网络应用QUdpSocket
可视化数据图表PyQtGraph
《快速掌握PyQt5》第三十六章 用PyQtGraph绘制可视化数据图表 - 知乎
动画QPropertyAnimation、QSequentialAnimationGroup、QParallelAnimationGroup、QTimeLine