PyQt5 調研(一)

工具準備

編輯器: 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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章