Chuyển dữ liệu giữa 2 cửa sổ trong QT Designer Python

Một số bạn chưa biết cách chuyển dữ liệu qua lại giữa 2 cửa sổ trong QT Designer Python, nên Tui có viết bài blog này để các bạn tham khảo. Kịch bản như sau:

Ta có 1 giao diện chính:

Màn hình chính gồm 1 QTableWidget có 2 cột: mã sản phẩm, tên sản phẩm

và một nút “Mở form nhập liệu”. Form nhập liệu có giao diện như sau:

Màn hình chi tiết nhập liệu gồm có 2 ô nhập liệu là QLineEdit và 1 Button lưu

Khi nhấn Lưu thì chuyển đối tượng(dữ liệu) Sản phẩm từ màn hình chi tiết quay trở lại màn hình chính để cập nhật dữ liệu.

Ta tiến hành làm theo các bước sau.

Tạo 1 Project tên gì cũng được, ví dụ Tui đặt là “CallBackData”. Sau đó tạo các lớp, các giao diện có cấu trúc như sau(Tui sẽ hướng dẫn chi tiết từng thành phần):

Giao diện frmMain.ui: lưu vào project trên

Đặt tên control như giao diện trên.

Tiếp theo thiết kế giao diện frmNhapLieu.ui. lưu vào project trên.

Tiếp theo coding cho lớp SanPham:

class SanPham:
  def __init__(self, ma, ten):
    self.ma = ma
    self.ten =ten

Tiếp theo coding cho màn hình chính đó là lớp Main.py.

import sys
from PyQt5 import QtCore, QtGui, QtWidgets, uic
from PyQt5.QtWidgets import QDialog, QTableWidgetItem, QApplication, QMainWindow, QTableWidget
from PyQt5 import QtWidgets, QtCore, QtGui

import NhapLieu
#nạp giao diện
Ui_MainWindow, QtBaseClass = uic.loadUiType('frmMain.ui')

class frmMain(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        QtWidgets.QMainWindow.__init__(self)
        Ui_MainWindow.__init__(self)
        self.setupUi(self)

        self.btnMoFormNhapLieu.clicked.connect(self.moFormNhapLieu)

    def moFormNhapLieu(self):
        fNhapLieu.setModal(True)
        fNhapLieu.show()
    #đây là hàm call back của main, từ màn hình chi tiết khi bấm lưu sẽ gọi hàm này
    #thông qua alias ref
    #truyền đối tượng sản phẩm từ chi tiết qua đây để xử lý
    def luuDuLieu(self,sp):
        #thêm 1 dòng mới cho QTableWidgetItem:
        self.tblSanPham.insertRow(self.tblSanPham.rowCount())
        row=self.tblSanPham.rowCount()-1
        self.tblSanPham.setItem(row, 0, QTableWidgetItem(sp.ma))
        self.tblSanPham.setItem(row, 1, QTableWidgetItem(sp.ten))

if __name__ == "__main__":
    #tạo các đối tượng cho màn hình chính
    app = QtWidgets.QApplication(sys.argv)
    fMain = frmMain()
    fMain.show()
    #màn hình chi tiết
    fNhapLieu = NhapLieu.frmNhapLieu()
    #truyền tham chiếu màn hình chính qua màn hình chi tiết
    #alias lưu tham chiếu này đặt tên là ref (bạn đặt tên gì tùy)
    fNhapLieu.ref=fMain

    sys.exit(app.exec_())

Code Main.py sẽ hiển thị màn hình chính “frmMain.ui” Cũng như xử lý sự kiện và lắng nghe callback trả đối tượng về từ màn hình chi tiết.

Dưới đây là coding cho màn hình chi tiết NhapLieu.py:

import sys
from PyQt5.uic import loadUi
from PyQt5.QtWidgets import QDialog
from PyQt5 import QtWidgets

from SanPham import SanPham


class frmNhapLieu(QDialog):

    def __init__(self):
        super(frmNhapLieu, self).__init__()
        loadUi('frmNhapLieu.ui',self)
        self.btnLuu.clicked.connect(self.xuLyLuu)
        self.ref=None
    def xuLyLuu(self):
        #lấy dữ liệu trên giao diện
        ma= self.txtMa.text()
        ten=self.txtTen.text()
        #khởi tạo thành đối tượng sản phẩm
        sp=SanPham(ma,ten)
        #gửi đối tượng ngược lại cho màn hình chính (gọi là callBack)
        self.ref.luuDuLieu(sp)

Như vậy ta đã xử lý xong phần giao diện cũng như cách thức truyền dữ liệu qua lại giữa 2 cửa sổ (callback)

coding có thể tải ở đây:

https://github.com/thanhtd32/qtdesigner/tree/main/CallBackData

hoặc ở đây:

https://www.mediafire.com/file/5l498quoqzygi9f/CallBackData.rar/file

Leave a Reply