工具准备

编辑器: vscode OR Pycharm

vscode需要安装PYQT Integration 以及 Python 插件, Pycharm需要配置External Tools

pycharm配置External Tools

  • 配置Qtdesigner.exe
program选择Qtdesigner.exe的路径, Arguments: $FilePath$, work directory: $FileDir$
  • 配置PyUI, 将UI文件转换成Python文件
program: python, Arguments: -m PyQt5.uic.pyuic $FileName$ -o $FileNameWithoutExtension$.py, work direactory: $FileDir$

布局绘制

没有布局的控件不会随着窗口的改变而改变,关于布局,看这个Qt布局博客

第一个控件: tableView

self.sm = QtGui.QStandardItemModel() // 标准数据模型# 设置数据头栏名称self.sm.setHorizontalHeaderItem(0, QtGui.QStandardItem("Name"))self.sm.setHorizontalHeaderItem(1, QtGui.QStandardItem("NO."))# 设置数据条目self.sm.setItem(0, 0, QtGui.QStandardItem("张三"))self.sm.setItem(0, 1, QtGui.QStandardItem("20120202"))self.sm.setItem(1, 0, QtGui.QStandardItem("李四"))self.sm.setItem(1, 1, QtGui.QStandardItem("20120203000000000000000"))self.sm.setItem(2, 0, QtGui.QStandardItem("李四"))self.sm.setItem(2, 1, QtGui.QStandardItem("20120203000000000000000"))self.sm.setItem(3, 0, QtGui.QStandardItem("李四"))self.sm.setItem(3, 1, QtGui.QStandardItem("20120203000000000000000"))self.sm.setItem(4, 0, QtGui.QStandardItem("李四"))self.sm.setItem(4, 1, QtGui.QStandardItem("20120203000000000000000"))self.sm.setItem(5, 0, QtGui.QStandardItem("李四"))self.sm.setItem(5, 1, QtGui.QStandardItem("20120203000000000000000"))# 设置条目颜色和字体self.sm.item(0, 0).setForeground(QtGui.QBrush(QtGui.QColor(255, 0, 0)))self.sm.item(3, 1).setBackground(QtGui.QBrush(QtGui.QColor(255, 255, 0)))# 按照编号排序self.sm.sort(1, QtCore.Qt.DescendingOrder)# 将数据模型绑定到QTableViewself.tableView.setModel(self.sm)for c in range(self.tableView.horizontalHeader().count()):    self.tableView.horizontalHeader().setSectionResizeMode(c) // 设置列宽自动填充·
  • 关于动态新增行:对model进行操作就行,tableView会感应到数据变化

信号与槽

知道vue,react的事件机制会对pyqt的信号与槽机制的理解提供方便。

  • 首先,定义自定义信号
insertSuccess = pyqtSignal(str, str)

其中pyqtSignal来自于from PyQt5.QtCore import pyqtSignal, insertSuccess信号会携带两个字符串类型的数据。

  • 然后,在子窗口发射这个信号
self.name = self.lineEdit.text()self.no = self.lineEdit_2.text()self.hide()self.insertSuccess.emit(self.name, self.no)
  • 最终,在父窗口槽函数接受这个信号
 myDia = childWindow(self) myDia.insertSuccess.connect(self.deal_insert)

self.deal_insert就是槽函数,用来接受信号

def deal_insert(self, name, no):    print('name: ', name, 'no: ', no)