PyQt5
text::Python
一、PyQt5安装
PyQt5库
C++PyQt5库
安装:pip install PyQt5 -i https://pypi.douban.com/simple
二、QT designer
安装:
- 安装 配置 版本问题 3.9.0a4不行
pip install PyQt5-tools -i https://pypi.douban.com/simple
- python版本要在 3.10 以下且3.9.0a4不行
- pycharm External Tools页面位置:File > Settings > Tools > External Tools
配置工具:
import sys from PyQt5.QtWidgets import QApplication from PyQt5 import uic
if __name__ == '__main__': app = QApplication(sys.argv) ui = uic.loadUi("./untitled.ui") ui.show() app.exec_()
|
1 窗口
1.1 简单案例
import sys
if __name__ == '__main__':
app = QApplication(sys.argv)
app.setApplicationName("Hello World")
w = QWidget()
w.setWindowTitle("Hello World")
w.show()
app.exec_()
|
1.2 格式案例
import sys
class MyWindow(QWidget): def __init__(self): super(MyWindow, self).__init__() self.setWindowTitle("系统")
if __name__ == '__main__': app = QApplication(sys.argv) w = MyWindow() w.show() app.exec_()
|
1.3 窗口类型
QWidget:控件和窗口的父类,自由度高(无其他区域),没有划分菜单、工具栏、状态栏、主窗口等区域。
QMainWindow:是 QWidget 的子类,包含菜单栏、工具栏、状态栏、标题栏等,中间部分则为主窗口区域。
QDialog:对话框窗口的基类。
QMessage:消息窗口。
1.4 QDialog
QDialog
QFileDialog使用:
QFileDialog
例:image_file, _ =QFileDialog.getOpenFileName(self,'Open file','C:\\','Image files (*.jpg *.gif *.png *.jpeg)')
QFileDialog参数:
- self:用于指定父组件。
open file
:是QFileDialog对话框的标题。
C:\\
:\’默认打开的目录,Linux 和 Windows 杠不同,””表示当前目录。
- 对话框中文件扩展名过滤器(fliter),比如使用
Image files (.jpg .gif .png .jpeg)
表示只能显示扩展名为.jpg, .gif
等文件。
1.5 QMessage
QMessage
QMessageBox.Critical:错误窗口
1.6 窗口属性
obj.resize(x,y)
obj.move(x,y)
obj.frameGeometry()
obj.setStyleSheet("backgroud-color:grey;")
obj.setCentralWidget(label)
menu.setNativeMenuBar(False)
|
1.7 案例
隐藏标题栏:
width = 300 height = 300 window.resize(width , height)
center_point = QDesktopWidget().availableGeometry().center() x = center_point.x() y = center_point.y()
window.move(x - width // 2,y - height // 2)
old_x,old_y,wi,he = w.frameGeometry().getRect() window.move(x - wi // 2, y - he // 2) window.show()
self.setCentralWidget(container)
|
2 控件
2.1 按钮
按钮
bin = QPushButton( "按钮" ) bin.setParent( window )
bin = QPushButton( "按钮" , w )
|
2.2 文本
label = QLabel("账号:", window )
|
2.3 文本框
QPlainTextEdit
常用信号
line = QLineEdit( window )
line.setPlainText(res)
line.setPlaceholderText( "text" )
line.text()
text = QPlainTextEdit()
text.toPlainText()
undo redo
|
2.4 选项框
hobby_box = QGroupBox("爱好")
bt1 = QRadioButton("抽烟")
hobby_box.addButton(bt1)
Qbox = QComboBox()
Qbox.addItems(dict)
QBox.currentTextChanged[str].connect(slot)
|
2.5 滚动对象
QScrollArea()
scroll = QScrollArea() v_layout = QVBoxLayout() v_layout.addWidget(scroll)
|
2.6 计数器
spin = QSpinBox()
spin.setRange(min,max,[step=1])
spin.spin.setMinimum() spin.setMaximum() spin.setValue() spin.singleStep()
spin.value()
spin.valueChanged.connect(slot)
|
2.7 表格
author::QTableWidget
self.table_widget = QTableWidget()
self.table_widget.setRowCount(row) self.table_widget.setColumnCount(col)
self.table_widget.verticalHeader().setVisible(False)
self.table_widget.setHorizontalHeaderLabels([ "账号", "密码"])
font = self.table_widget.horizontalHeader().font() font.setBold(True) self.table_widget.horizontalHeader().setFont(font)
self.table_widget.horizontalHeader().resizeSection(index,size)
item.setFlags(item.flags() & ~Qt.ItemIsEditable)
self.table_widget.cellDoubleClicked.connect(self.inspect) def inspect(self,row,col): print("Clicked on row:", row) print("Clicked on column:", col)
|
2.8 控件属性
obj.value()
obj.setGeometry(x,y,w,h)
obj.setFixedSize(x,y)
obj.frameSize()
obj.setWordWrap(True)
obj.setAlignment(Qt.AlignTop)
obj.setText / setPlainText(text)
obj.setStatusTip(text)
obj.setShortcut("Ctrl+N")
setLineWrapMode(1 if text.lineWrapMode() == 0 else 0)
obj.repaint()
setStyleSheet(css); bt.setStyleSheet('border: 1px solid black; padding: 10px; font-size: 24px')
|
3 基础布局
3.1 盒子
QHBoxLayout QVBoxLayout
layout = QVBoxLayout() window.setLayout(layout)
layout.addWidget(obj)
layout.addStretch([num])
layout.addWidget(layout)
|
3.2 网格
QGridLayout
layout.addWidget(obj,row,col)
layout.addLayout(bt)
|
3.3 表单
QFormLayout
layout.addRow(obj_1 , obj_2 , ...)
|
3.4 抽屉
stacked_layout = QStackedLayout()
stacked_widget = QStackWidget()
stack.setCurrentIndex(0)
stacked_layout.addChildLayout(init_layout) stacked_widget.addWidget(init_layout)
|
3.5 布局属性
Box.addWidget(layout,alignment=Qt.AlignCenter)
|
4 顶端栏
4.1 顶端栏
QMenuBar
menu = self.menuBar().addMenu("&name")
file_menu.addAction(name)
|
4.2 状态栏
QStatuBar QToolBar
self.status = QStatusBar()
self.setStatusBar(self.status)
self.status = QToolBar()
obj.addSeparator()
|
四、PyQt5.QtGui
1 图标
QAction
图标网
window.setWindowIcon(QIcon("img.png"))
widget.setIconSzie(Qsize(w,h))
QAction
|
2 字体
font = QFont()
QFontDatabase
fixedfont = QFontDatabase.systemFont( type )
fixedfont.setPointSize(num)
fixedfont.setBold(bool)
self.editor.setFont(fixedfont)
|
五、PyQt5.QtCore
1 信号与槽
信号与槽
obj.signal.connect(slot)
obj.signal.emit(func_argv)
lambda: self.func( a , b , ... )
clicked
triggered
currentTextChanged[str]
valueChanged
my_signal = pyqtSignal( str , .... )
|
class MainWindow(QWidget): def __init__(self): super().__init__() def init_table_row(self,condition:Union[bool,list] = True): data = global_behavior.keyword_query(condition) def add_new_account(self): self.add_child_win = AddNewAccount() self.add_child_win.close_signal.connect(self.init_table_row) self.add_child_win.show()
class AddNewAccount(QWidget): close_signal = pyqtSignal() def add_new_account(self): self.close_signal.emit()
|
2 多线程
self.ui = MyThread() self.ui.start()
class MyThread( QThread ): def __init__(self): super().__init__() def run( self ): pass
|
def update_Text(self,res): pass
self.attack = AttackThread()
self.attack.receive_signal.connect(attack.receive_Signal)
self.attack.send_signal.connect(self.update_Text)
self.attack.receive_signal.emit(para)
self.attack.start()
class AttackThread(QThread): receive_signal = pyqtSignal(list) send_signal = pyqtSignal(str) def receive_Signal(self,para): pass
|
六、打包
窗口化应用程序作为单文件可执行文件:pyinstaller --onefile --windowed myfile.py
七、问题
安装QtWebEngineWidgets:
- pip install pyqt5==5.10.1
- pip install PyQtWebEngine
八、案例
二维码识别:简单二维码 复杂二维码
图形化界面:普通十五个项目