PyQt5-调研一

62次阅读

共计 2084 个字符,预计需要花费 6 分钟才能阅读完成。

工具准备

编辑器: 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)

# 将数据模型绑定到 QTableView
self.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)

正文完
 0