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
 
八、案例
二维码识别:简单二维码    复杂二维码
图形化界面:普通十五个项目