共计 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) |
正文完
发表至: javascript
2019-06-05