pyqt给js赋值,获取form表单值

本文介绍如何利用PyQt的Webkit模块渲染HTML,并实现Python与JavaScript之间的数据交互,包括从Python向JS传递数据及从HTML表单获取数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

帮同事写客户端,发现pyqt和wxpython的api何其的多,资料又少,写一个包含各种表单的客户端对我来说难度很大,于是想到使用webkit来渲染html,pyqt自然成了我的选择。

但是发现,平时在web开发中,html向web后台获取数据或者提交数据这样简单的事,在pyqt中我完全不知道怎么办,资料又各种少。

最后找到了对应的简单例子,但是获取表单数据的那个例子在怎么都不起作用(google翻来覆去的查都只有那个例子),正在要放弃的时候,又突然能用了,感觉醉了。由于pyqt完全不懂,用它也只是为了写个东西出来,所以不打算深究,既然能用了,就这样吧。。


下面是整合了的代码:

import sys
from PyQt4 import QtCore, QtGui, QtWebKit
import json
from urllib import unquote_plus

class StupidClass(QtCore.QObject):

    def _pyVersion(self):
        return json.dumps(sys.version)

    pyVersion = QtCore.pyqtProperty(str, fget=_pyVersion)


class MyWebPage(QtWebKit.QWebPage):
    formSubmitted = QtCore.pyqtSignal(QtCore.QUrl)

    def acceptNavigationRequest(self, frame, req, nav_type):
        if nav_type == QtWebKit.QWebPage.NavigationTypeFormSubmitted:
            print 111
            self.formSubmitted.emit(req.url())
        return super(MyWebPage, self).acceptNavigationRequest(frame, req, nav_type)


def handleFormSubmitted(url):
        elements = {}
        for key, value in url.encodedQueryItems():
            key = unquote_plus(bytes(key)).decode('utf8')
            value = unquote_plus(bytes(value)).decode('utf8')
            elements[key] = value
        for item in elements.iteritems():
            print '"%s" = "%s"' % item

def main():
    app = QtGui.QApplication(sys.argv)

    myObj = StupidClass()

    browser= QtWebKit.QWebView()
    browser.setPage(MyWebPage())
    browser.page().mainFrame().addToJavaScriptWindowObject("pyObj", myObj)
    browser.page().formSubmitted.connect(handleFormSubmitted)
    browser.load(QtCore.QUrl("./StreamBlock.html"))

    window = QtGui.QMainWindow()
    window.setCentralWidget(browser)
    window.show()

    sys.exit(app.exec_())

if __name__ == "__main__":
    main()
StreamBlock.html内容:

<!doctype html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <link type="text/css" rel="stylesheet" href="./css/common.css">
    <script type="text/javascript" src="./js/jquery.min.js"></script>
    <script>
        $(document).ready(function(){
            $(".cmn_btn").click(function(){
                alert(pyObj.pyVersion);
            })
        })
    </script>
</head>
<body>
<div>
    <input type="button" class="cmn_btn" value="全选"/>
    <input type="button" class="cmn_btn" value="新建"/>
    <input type="button" class="cmn_btn" value="删除"/>
    <form action="" type="post">
        <input type="text" name="name"/>
        <input type="submit"/>
    </form>
</div>
<div>
<table
</div>
</body>
</html>


在这个例子里只能用page().load(),不能用page().setHtml()。form表单数据获取不到,没有深究,感兴趣的可以研究下。

可以看到,这个例子里面,python把数据传给了js,同时也能获取html form表单的数据。

心好累,不过终于能愉快的写html/css/js了。


续:最后时间有限,没时间研究web和pyqt交互,所以就直接启动了一个django,把它弄成守护进程,如果启动客户端的时候这个守护进程没有起来就手动起一下


本人出于个人兴趣,创建了一个个人公众号,每天筛选国外网友发现的有趣的事情推送到公众号,欢迎关注!


这是一个企业用简易的进销存系统中的部分代码,现在这个模块出现问题,在新建订单添加物料时点击ok添加无效,随即程序崩溃,两项测试输出均正确,出现“加载订单错误: 'UserDB' object has no attribute 'get_purchase_orders'”的提示,请你帮助我在程序中添加更多调试输出,帮我定位问题,再尝试解决问题 from PyQt5.QtWidgets import ( QWidget, QVBoxLayout, QHBoxLayout, QTableWidget, QTableWidgetItem, QPushButton, QHeaderView, QLineEdit, QLabel, QFormLayout, QDialog, QDialogButtonBox, QMessageBox, QTabWidget, QComboBox, QDateEdit, QAbstractItemView, QSplitter, QSizePolicy ) from PyQt5.QtCore import Qt, QDate from PyQt5.QtGui import QBrush, QColor from purchase_manager.purchase_db import PurchaseDB from purchase_manager.purchase_models import PurchaseOrder, PurchaseOrderItem from basicData_manager.basic_data_db import BasicDataDB class PurchaseOrderFormDialog(QDialog): def __init__(self, parent=None, order=None): super().__init__(parent) self.setWindowTitle("编辑采购订单" if order else "新建采购订单") self.setMinimumSize(900, 650) self.db = BasicDataDB() self.purchase_db = PurchaseDB() self.order = order self.items = [] layout = QVBoxLayout() # 表单区域 form_layout = QFormLayout() # 订单编号(自动生成或只读) self.order_number_input = QLineEdit() self.order_number_input.setReadOnly(bool(order)) if not order: self.order_number_input.setText(self.generate_order_number()) # 供应商选择 self.supplier_combo = QComboBox() self.populate_suppliers() # 日期选择 self.order_date_edit = QDateEdit(QDate.currentDate()) self.order_date_edit.setCalendarPopup(True) self.expected_delivery_edit = QDateEdit(QDate.currentDate().addDays(7)) self.expected_delivery_edit.setCalendarPopup(True) form_layout.addRow("订单编号:", self.order_number_input) form_layout.addRow("供应商:", self.supplier_combo) form_layout.addRow("订单日期:", self.order_date_edit) form_layout.addRow("预计交货日期:", self.expected_delivery_edit) # 物料明细表格 self.items_table = QTableWidget() self.items_table.setColumnCount(9) self.items_table.setHorizontalHeaderLabels([ "ID", "物料编码", "物料名称", "规格", "单位", "数量", "税前单价", "税率", "金额" ]) self.items_table.horizontalHeader().setSectionResizeMode(1, QHeaderView.ResizeToContents) self.items_table.horizontalHeader().setSectionResizeMode(2, QHeaderView.Stretch) self.items_table.setSelectionBehavior(QTableWidget.SelectRows) self.items_table.setEditTriggers(QTableWidget.DoubleClicked) # 允许编辑数量 # 添加物料按钮 add_item_btn = QPushButton("添加物料") add_item_btn.clicked.connect(self.add_item) # 删除物料按钮 remove_item_btn = QPushButton("删除选中物料") remove_item_btn.clicked.connect(self.remove_selected_items) button_layout = QHBoxLayout() button_layout.addWidget(add_item_btn) button_layout.addWidget(remove_item_btn) button_layout.addStretch() # 合计金额 self.total_amount_label = QLabel("0.00") form_layout.addRow("合计金额:", self.total_amount_label) layout.addLayout(form_layout) layout.addWidget(QLabel("订单明细:")) layout.addWidget(self.items_table) layout.addLayout(button_layout) # 初始化数据 if order: self.load_order_data(order) else: # 初始加载空表格 self.items_table.setRowCount(0) # 按钮区域 button_box = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) button_box.accepted.connect(self.validate_and_accept) button_box.rejected.connect(self.reject) layout.addWidget(button_box) self.items_table.itemChanged.connect(self.on_item_changed) self.setLayout(layout) def generate_order_number(self): """生成唯一的订单编号""" from datetime import datetime return f"{datetime.now().strftime('%Y%m%d%H%M%S')}" def populate_suppliers(self): """填充已审核的供应商""" try: suppliers = self.db.get_suppliers(status='approved') self.supplier_combo.clear() for supplier in suppliers: self.supplier_combo.addItem(f"{supplier[1]} - {supplier[2]}", supplier[0]) except Exception as e: print(f"加载供应商错误: {str(e)}") def load_order_data(self, order): """加载订单数据""" self.order_number_input.setText(order.order_number) self.supplier_combo.setCurrentText(order.supplier_name) self.order_date_edit.setDate(QDate.fromString(order.order_date, "yyyy-MM-dd")) self.expected_delivery_edit.setDate(QDate.fromString(order.expected_delivery_date, "yyyy-MM-dd")) # 加载订单明细 order_items = self.purchase_db.get_purchase_order_details(order.id) self.items = [] self.items_table.setRowCount(len(order_items)) for row, item in enumerate(order_items): self.items.append({ "product_id": item['product_id'], "code": item['product_code'], "name": item['product_name'], "specification": item['specification'], "unit": item['unit'], "quantity": item['quantity'], "unit_price": item['unit_price'], "tax_rate": item['tax_rate'] }) self.items_table.setItem(row, 0, self.create_readonly_item(str(item['id']))) self.items_table.setItem(row, 1, self.create_readonly_item(item['product_code'])) self.items_table.setItem(row, 2, self.create_readonly_item(item['product_name'])) self.items_table.setItem(row, 3, self.create_readonly_item(item['specification'])) self.items_table.setItem(row, 4, self.create_readonly_item(item['unit'])) self.items_table.setItem(row, 5, QTableWidgetItem(str(item['quantity']))) self.items_table.setItem(row, 6, QTableWidgetItem(f"{item['unit_price']:.2f}")) self.items_table.setItem(row, 7, QTableWidgetItem(f"{item['tax_rate'] * 100:.0f}%")) self.items_table.setItem(row, 8, self.create_readonly_item(f"{item['total_price']:.2f}")) self.update_total_amount() def add_item(self): """打开物料选择对话框""" dialog = ProductSelectionDialog(self) if dialog.exec_() == QDialog.Accepted: # 测试输出 print("02 - Selected Products to Add:") print(dialog.selected_products) for product in dialog.selected_products: # 检查是否已添加过该物料(通过ID检查) existing = next((item for item in self.items if item.get("id") == product["id"]), None) if existing: # 如果已存在,增加数量 row_index = self.items.index(existing) current_qty = int(self.items_table.item(row_index, 5).text()) new_qty = current_qty + 1 # 更新表格 self.items_table.item(row_index, 5).setText(str(new_qty)) # 更新内存中的数据 self.items[row_index]["quantity"] = new_qty else: # 添加新物料 self.add_item_to_table(product) def add_item_to_table(self, product): """添加物料到表格""" row = self.items_table.rowCount() self.items_table.insertRow(row) # 创建物料数据对象(包含所有必要属性) item_data = { "id": product["id"], "code": product["code"], "name": product["name"], "specification": product["specification"], "unit": product["unit"], "quantity": 1, # 默认数量为1 "unit_price": product["purchase_price"], "tax_rate": product["tax_rate"] } self.items.append(item_data) # 设置表格项 self.items_table.setItem(row, 0, self.create_readonly_item(str(product["id"]))) self.items_table.setItem(row, 1, self.create_readonly_item(product["code"])) self.items_table.setItem(row, 2, self.create_readonly_item(product["name"])) self.items_table.setItem(row, 3, self.create_readonly_item(product["specification"])) self.items_table.setItem(row, 4, self.create_readonly_item(product["unit"])) self.items_table.setItem(row, 5, QTableWidgetItem("1")) # 数量 self.items_table.setItem(row, 6, QTableWidgetItem(f"{product['purchase_price']:.2f}")) self.items_table.setItem(row, 7, QTableWidgetItem(f"{product['tax_rate'] * 100:.0f}%")) # 计算并设置总价 total_price = product['purchase_price'] * (1 + product['tax_rate']) self.items_table.setItem(row, 8, self.create_readonly_item(f"{total_price:.2f}")) self.update_total_amount() def create_readonly_item(self, text): """创建只读表格项""" item = QTableWidgetItem(text) item.setFlags(item.flags() & ~Qt.ItemIsEditable) return item def remove_selected_items(self): """删除选中物料""" selected_rows = sorted(set(index.row() for index in self.items_table.selectedIndexes())) if not selected_rows: QMessageBox.warning(self, "选择错误", "请先选择要删除的物料行") return for row in reversed(selected_rows): self.items_table.removeRow(row) del self.items[row] self.update_total_amount() def update_total_amount(self): """更新总金额""" total = 0.0 for row in range(self.items_table.rowCount()): quantity = float(self.items_table.item(row, 5).text() or 0) unit_price = float(self.items_table.item(row, 6).text() or 0) tax_rate = float(self.items_table.item(row, 7).text().rstrip('%')) / 100 total += quantity * unit_price * (1 + tax_rate) self.total_amount_label.setText(f"{total:.2f}") def validate_and_accept(self): """验证表单并接受""" if not self.items: QMessageBox.warning(self, "验证错误", "订单必须包含至少一个物料") return if self.supplier_combo.currentIndex() == -1: QMessageBox.warning(self, "验证错误", "请选择供应商") return self.accept() def get_order_data(self): """获取订单数据""" order_data = { "order_number": self.order_number_input.text(), "supplier_id": self.supplier_combo.currentData(), "order_date": self.order_date_edit.date().toString("yyyy-MM-dd"), "expected_delivery_date": self.expected_delivery_edit.date().toString("yyyy-MM-dd"), "total_amount": float(self.total_amount_label.text()), "items": [] } for row in range(self.items_table.rowCount()): item = { "product_id": int(self.items_table.item(row, 0).text()), "quantity": int(self.items_table.item(row, 5).text()), "unit_price": float(self.items_table.item(row, 6).text()), "tax_rate": float(self.items_table.item(row, 7).text().rstrip('%')) / 100 } order_data["items"].append(item) return order_data def on_item_changed(self, item): """当物料数量改变时更新金额""" if item.column() in (5, 6, 7): # 数量、单价或税率列改变 row = item.row() try: quantity = float(self.items_table.item(row, 5).text() or 0) unit_price = float(self.items_table.item(row, 6).text() or 0) tax_rate = float(self.items_table.item(row, 7).text().rstrip('%') or 0) / 100 total_price = quantity * unit_price * (1 + tax_rate) # 更新金额列 self.items_table.item(row, 8).setText(f"{total_price:.2f}") # 更新总金额 self.update_total_amount() except ValueError: # 输入无效时跳过 pass class ProductSelectionDialog(QDialog): def __init__(self, parent=None): super().__init__(parent) self.setWindowTitle("选择物料") self.setFixedSize(800, 500) self.selected_product = None self.db = BasicDataDB() self.selected_products = [] layout = QVBoxLayout() # 搜索区域 search_layout = QHBoxLayout() self.search_input = QLineEdit() self.search_input.setPlaceholderText("输入物料名称或编码...") self.search_input.textChanged.connect(self.load_products) search_layout.addWidget(QLabel("搜索:")) search_layout.addWidget(self.search_input) layout.addLayout(search_layout) # 物料表格 self.products_table = QTableWidget() self.products_table.setColumnCount(8) self.products_table.setHorizontalHeaderLabels([ "选择","ID", "物料编码", "物料名称", "规格", "单位", "税前进价", "税率" ])# 拓展新列 ——税率 self.products_table.verticalHeader().setVisible(False) self.products_table.setSelectionBehavior(QAbstractItemView.SelectRows) self.products_table.setSelectionMode(QAbstractItemView.SingleSelection) self.products_table.horizontalHeader().setSectionResizeMode(1, QHeaderView.ResizeToContents) self.products_table.horizontalHeader().setSectionResizeMode(2, QHeaderView.Stretch) self.products_table.horizontalHeader().setSectionResizeMode(3, QHeaderView.Stretch) self.products_table.setSelectionMode(QAbstractItemView.MultiSelection) self.products_table.setSelectionBehavior(QAbstractItemView.SelectRows) layout.addWidget(self.products_table) # 按钮区域 button_box = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) button_box.accepted.connect(self.on_accept) button_box.rejected.connect(self.reject) layout.addWidget(button_box) self.setLayout(layout) # 初始加载数据 self.load_products() def load_products(self, search_term=None): """加载物料数据并应用搜索过滤""" try: products = self.db.get_products(status='approved') # 应用搜索过滤 if search_term: search_term = search_term.lower().strip() products = [p for p in products if search_term in p[1].lower() or # 物料编码 search_term in p[2].lower()] # 物料名称 self.products_table.setRowCount(len(products)) for row, product in enumerate(products): # 选择框 select_item = QTableWidgetItem() select_item.setCheckState(Qt.Unchecked) self.products_table.setItem(row, 0, select_item) # 物料数据 self.products_table.setItem(row, 1, QTableWidgetItem(str(product[0]))) # ID self.products_table.setItem(row, 2, QTableWidgetItem(product[1])) # 编码 self.products_table.setItem(row, 3, QTableWidgetItem(product[2])) # 名称 self.products_table.setItem(row, 4, QTableWidgetItem(product[4])) # 规格 self.products_table.setItem(row, 5, QTableWidgetItem(product[5])) # 单位 self.products_table.setItem(row, 6, QTableWidgetItem(f"{product[6]:.2f}")) # 进价 self.products_table.setItem(row, 7, QTableWidgetItem(f"{product[7]:.2f}")) # 税率 # 设置整行选择 self.products_table.setSelectionBehavior(QAbstractItemView.SelectRows) except Exception as e: print(f"加载物料错误: {str(e)}") def on_accept(self): """处理确定按钮点击""" self.selected_products = [] for row in range(self.products_table.rowCount()): if self.products_table.item(row, 0).checkState() == Qt.Checked: product = { "id": int(self.products_table.item(row, 1).text()), # 索引1 "code": self.products_table.item(row, 2).text(), # 索引2 "name": self.products_table.item(row, 3).text(), # 索引3 "specification": self.products_table.item(row, 4).text(), # 索引4 "unit": self.products_table.item(row, 5).text(), # 索引5 "purchase_price": float(self.products_table.item(row, 6).text()), # 索引6 "tax_rate": float(self.products_table.item(row, 7).text()) # 索引7 } self.selected_products.append(product) # 测试输出 - 可以保留用于调试 print("01 - Selected Products:") print(self.selected_products) if not self.selected_products: QMessageBox.warning(self, "选择错误", "请至少选择一个物料") return self.accept() class PurchaseOrderManager(QWidget): def __init__(self, current_user, db, parent=None): super().__init__(parent) self.current_user = current_user self.db = db or PurchaseDB() self.basic_db = BasicDataDB() self.init_ui() self.load_orders() def init_ui(self): layout = QVBoxLayout() # 顶部按钮区域 button_layout = QHBoxLayout() self.new_btn = QPushButton("新建订单") self.new_btn.clicked.connect(self.show_new_form) self.edit_btn = QPushButton("修改订单") self.edit_btn.clicked.connect(self.show_edit_form) self.submit_btn = QPushButton("提交订单") self.submit_btn.clicked.connect(self.submit_order) self.approve_btn = QPushButton("审核订单") self.approve_btn.clicked.connect(self.approve_order) self.refresh_btn = QPushButton("刷新") self.refresh_btn.clicked.connect(self.load_orders) button_layout.addWidget(self.new_btn) button_layout.addWidget(self.edit_btn) button_layout.addWidget(self.submit_btn) button_layout.addWidget(self.approve_btn) button_layout.addStretch() button_layout.addWidget(self.refresh_btn) # 搜索区域 search_layout = QHBoxLayout() self.status_combo = QComboBox() self.status_combo.addItem("全部状态", "") self.status_combo.addItem("草稿", "draft") self.status_combo.addItem("已提交", "submitted") self.status_combo.addItem("已审核", "approved") self.status_combo.addItem("已收货", "received") self.status_combo.addItem("已取消", "canceled") self.status_combo.currentIndexChanged.connect(self.load_orders) self.supplier_combo = QComboBox() self.populate_suppliers() self.supplier_combo.currentIndexChanged.connect(self.load_orders) self.date_from = QDateEdit(QDate.currentDate().addMonths(-1)) self.date_from.setCalendarPopup(True) self.date_from.dateChanged.connect(self.load_orders) self.date_to = QDateEdit(QDate.currentDate()) self.date_to.setCalendarPopup(True) self.date_to.dateChanged.connect(self.load_orders) search_layout.addWidget(QLabel("状态:")) search_layout.addWidget(self.status_combo) search_layout.addWidget(QLabel("供应商:")) search_layout.addWidget(self.supplier_combo) search_layout.addWidget(QLabel("日期从:")) search_layout.addWidget(self.date_from) search_layout.addWidget(QLabel("到:")) search_layout.addWidget(self.date_to) # 订单表格 self.orders_table = QTableWidget() self.orders_table.setColumnCount(8) self.orders_table.setHorizontalHeaderLabels([ "ID", "订单编号", "供应商", "订单日期", "交货日期", "总金额", "状态", "创建人" ]) self.orders_table.horizontalHeader().setSectionResizeMode(1, QHeaderView.Stretch) self.orders_table.horizontalHeader().setSectionResizeMode(2, QHeaderView.Stretch) self.orders_table.setSelectionBehavior(QTableWidget.SelectRows) self.orders_table.setEditTriggers(QTableWidget.NoEditTriggers) self.orders_table.doubleClicked.connect(self.show_order_details) # 订单明细表格 self.items_table = QTableWidget() self.items_table.setColumnCount(7) self.items_table.setHorizontalHeaderLabels([ "物料编码", "物料名称", "规格", "单位", "数量", "单价", "金额" ]) self.items_table.horizontalHeader().setSectionResizeMode(1, QHeaderView.Stretch) self.items_table.setEditTriggers(QTableWidget.NoEditTriggers) # 使用分割器 splitter = QSplitter(Qt.Vertical) splitter.addWidget(self.orders_table) splitter.addWidget(self.items_table) splitter.setSizes([300, 200]) layout.addLayout(button_layout) layout.addLayout(search_layout) layout.addWidget(splitter) self.setLayout(layout) # 根据用户角色设置按钮可见性 if self.current_user.role != "root": self.approve_btn.setVisible(False) def populate_suppliers(self): """填充供应商下拉框""" try: suppliers = self.basic_db.get_suppliers(status='approved') self.supplier_combo.clear() self.supplier_combo.addItem("全部供应商", -1) for supplier in suppliers: self.supplier_combo.addItem(f"{supplier[1]} - {supplier[2]}", supplier[0]) except Exception as e: print(f"加载供应商错误: {str(e)}") def load_orders(self): """加载采购订单""" try: status = self.status_combo.currentData() supplier_id = self.supplier_combo.currentData() if supplier_id == -1: supplier_id = None start_date = self.date_from.date().toString("yyyy-MM-dd") end_date = self.date_to.date().toString("yyyy-MM-dd") orders = self.db.get_purchase_orders( status=status, supplier_id=supplier_id, start_date=start_date, end_date=end_date ) self.orders_table.setRowCount(len(orders)) for row, order in enumerate(orders): self.orders_table.setItem(row, 0, QTableWidgetItem(str(order[0]))) # ID self.orders_table.setItem(row, 1, QTableWidgetItem(order[1])) # 订单编号 self.orders_table.setItem(row, 2, QTableWidgetItem(order[11])) # 供应商名称 self.orders_table.setItem(row, 3, QTableWidgetItem(order[3])) # 订单日期 self.orders_table.setItem(row, 4, QTableWidgetItem(order[4] or "")) # 交货日期 self.orders_table.setItem(row, 5, QTableWidgetItem(f"{order[5]:.2f}")) # 总金额 # 状态列 status_item = QTableWidgetItem(order[6]) if order[6] == "draft": status_item.setForeground(QBrush(QColor("gray"))) elif order[6] == "submitted": status_item.setForeground(QBrush(QColor("blue"))) elif order[6] == "approved": status_item.setForeground(QBrush(QColor("green"))) elif order[6] == "received": status_item.setForeground(QBrush(QColor("darkgreen"))) elif order[6] == "canceled": status_item.setForeground(QBrush(QColor("red"))) self.orders_table.setItem(row, 6, status_item) self.orders_table.setItem(row, 7, QTableWidgetItem(order[8])) # 创建人 # 清除明细表格 self.items_table.setRowCount(0) except Exception as e: print(f"加载订单错误: {str(e)}") QMessageBox.critical(self, "错误", f"加载订单失败: {str(e)}") def get_selected_order_id(self): """获取选中的订单ID""" selected = self.orders_table.selectedItems() if not selected: return None return int(self.orders_table.item(selected[0].row(), 0).text()) def show_new_form(self): """显示新建订单表单""" dialog = PurchaseOrderFormDialog(self) if dialog.exec_() == QDialog.Accepted: try: order_data = dialog.get_order_data() order_id = self.db.create_purchase_order(order_data, self.current_user.username) QMessageBox.information(self, "成功", f"采购订单 #{order_id} 创建成功!") self.load_orders() except Exception as e: QMessageBox.critical(self, "错误", f"创建采购订单失败: {str(e)}") def show_edit_form(self): """显示编辑订单表单""" order_id = self.get_selected_order_id() if not order_id: QMessageBox.warning(self, "选择错误", "请先选择一个订单") return # 获取订单详情 orders = self.db.get_purchase_orders() order_data = next((o for o in orders if o[0] == order_id), None) if not order_data: QMessageBox.warning(self, "错误", "找不到选中的订单") return # 检查订单状态 if order_data[6] not in ["draft", "submitted"]: QMessageBox.warning(self, "操作受限", "只能编辑草稿或已提交状态的订单") return # 创建订单对象 order = PurchaseOrder( id=order_data[0], order_number=order_data[1], supplier_id=order_data[2], supplier_name=order_data[11], order_date=order_data[3], expected_delivery_date=order_data[4], total_amount=order_data[5], status=order_data[6], created_by=order_data[8], created_at=order_data[9] ) dialog = PurchaseOrderFormDialog(self, order) if dialog.exec_() == QDialog.Accepted: try: update_data = dialog.get_order_data() self.db.update_purchase_order(order_id, update_data, self.current_user.username) QMessageBox.information(self, "成功", "采购订单更新成功!") self.load_orders() except Exception as e: QMessageBox.critical(self, "错误", f"更新采购订单失败: {str(e)}") def submit_order(self): """提交订单""" order_id = self.get_selected_order_id() if not order_id: QMessageBox.warning(self, "选择错误", "请先选择一个订单") return # 检查订单状态 orders = self.db.get_purchase_orders() order_data = next((o for o in orders if o[0] == order_id), None) if not order_data: QMessageBox.warning(self, "错误", "找不到选中的订单") return if order_data[6] != "draft": QMessageBox.warning(self, "操作受限", "只能提交草稿状态的订单") return try: self.db.submit_purchase_order(order_id, self.current_user.username) QMessageBox.information(self, "成功", "采购订单提交成功!") self.load_orders() except Exception as e: QMessageBox.critical(self, "错误", f"提交采购订单失败: {str(e)}") def approve_order(self): """审核订单""" order_id = self.get_selected_order_id() if not order_id: QMessageBox.warning(self, "选择错误", "请先选择一个订单") return # 检查订单状态 orders = self.db.get_purchase_orders() order_data = next((o for o in orders if o[0] == order_id), None) if not order_data: QMessageBox.warning(self, "错误", "找不到选中的订单") return if order_data[6] != "submitted": QMessageBox.warning(self, "操作受限", "只能审核已提交状态的订单") return try: self.db.approve_purchase_order(order_id, self.current_user.username) QMessageBox.information(self, "成功", "采购订单审核通过!") self.load_orders() except Exception as e: QMessageBox.critical(self, "错误", f"审核采购订单失败: {str(e)}") def show_order_details(self, index): """显示订单明细""" row = index.row() order_id = int(self.orders_table.item(row, 0).text()) try: items = self.db.get_purchase_order_details(order_id) self.items_table.setRowCount(len(items)) for row, item in enumerate(items): self.items_table.setItem(row, 0, QTableWidgetItem(item['product_code'])) self.items_table.setItem(row, 1, QTableWidgetItem(item['product_name'])) self.items_table.setItem(row, 2, QTableWidgetItem(item['specification'])) self.items_table.setItem(row, 3, QTableWidgetItem(item['unit'])) self.items_table.setItem(row, 4, QTableWidgetItem(str(item['quantity']))) self.items_table.setItem(row, 5, QTableWidgetItem(f"{item['unit_price']:.2f}")) self.items_table.setItem(row, 6, QTableWidgetItem(f"{item['total_price']:.2f}")) except Exception as e: print(f"加载订单明细错误: {str(e)}")
最新发布
07-22
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值