鱼C论坛

 找回密码
 立即注册
查看: 2461|回复: 8

[Python,Pyqt]这里可以发悬赏帖吗?有偿修改代码,重写QComboBox委托,50-100左右

[复制链接]
发表于 2023-7-7 10:43:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
昨天发帖学习了委托,实验了以后实在是写不出来,老报错。想花钱请人帮忙,我自己顺便再跟着代码学一下

                               
登录/注册后可看大图


                               
登录/注册后可看大图

需求:
点修改按钮,TableView,第1,2列可编辑   (已实现)
双击price后,price清空,输入金额,sql会匹配,有返回值。就把返回值传给ComboBox,并将ComboBox显示在【挂号等级type】列。(未实现)
无返回值,则提示“没有价格为{price}的号”(已实现)

目前未完成的代码如下:

from PySide6.QtCore import *
from PySide6.QtGui import *
from PySide6.QtWidgets import *
import sys
import Dbconnect
import MenuWindow
import CliPriceModifyWindow

class MenuWindow(MenuWindow.Ui_MainWindow,QMainWindow):
    def __init__(self):
        super(MenuWindow, self).__init__()
        self.setupUi(self)
        #定义QAction触发逻辑
        self.clipricemodi_window = CliPriceModifyWindow()
        self.actprice.triggered.connect(self.actprice_open)
        self.mExit.aboutToShow.connect(sys.exit)

    def actprice_open(self):
        a = self.windowTitle()
        if (a.split()[2] == '门诊办'):
            self.clipricemodi_window.show()
        else:
            QMessageBox.critical(self, '没有操作权限', '您不是门诊办人员!')

#重写ComboBox委托
class ComboBoxDelegate(QStyledItemDelegate):
    def __init__(self, parent=None):
        super(ComboBoxDelegate, self).__init__(parent)

    def createEditor(self, parent, option, index):
        editor = QComboBox(parent)
        return editor

    def setEditorData(self, editor, index):
        # 这个函数用来设置编辑器的数据
        price = index.model().data(index, Qt.ItemDataRole.DisplayRole)
        sqlprice = "SELECT C.CLINIC_TYPE FROM  (SELECT A.CLINIC_TYPE,SUM(B.PRICE) AS PRICE " \
                    "FROM CLINIC_TYPE_SETTING A,CURRENT_PRICE_LIST B  " \
                    "WHERE A.PRICE_ITEM=B.ITEM_CODE  GROUP BY A.CLINIC_TYPE) C " \
                    "WHERE C.PRICE='{price}'".format(price=price)
        Dbconnect.cursor.execute(sqlprice)
        sqlprice_result = Dbconnect.cursor.fetchall()
        # 添加到ComboBox中
        for i in sqlprice_result:
            editor.addItem(str(i))
        # 设置当前选中的项
        editor.setCurrentIndex(editor.findText(price))

    def setModelData(self, editor, model, index):
        # 当编辑器关闭时,将编辑器的数据写入模型
        value = editor.currentText()
        model.setData(index, value, Qt.EditRole)

    #触发事件:【价格price】变化,【挂号等级type】同步更新并传入ComboBox,类似触发器
    def onDataChanged(self, index):
        pass
        这一块还没写,不会写


#门诊办专区号表价格修改
class CliPriceModifyWindow(CliPriceModifyWindow.Ui_Form,QWidget):
    def __init__(self):
        super(CliPriceModifyWindow, self).__init__()
        self.setupUi(self)
        self.pBtnQuery.clicked.connect(self.cliprice_query)
        self.pBtnModify.clicked.connect(self.cliprice_modify)
        self.pBtnSave.clicked.connect(self.cliprice_save)
        self.pBtnReset.clicked.connect(self.cliprice_reset)

        # 号表查询  (此部分已正常实现)
    def cliprice_query(self):
        # 通过号表查询
        cliniclabel = self.lineEditClinic.text()
        # 查询明细,返回结果
        sql = "SELECT C.PRICE,A.CLINIC_TYPE,A.CLINIC_LABEL,B.DEPT_NAME,A.SHBLX,A.CLINIC_POSITION " \
                "FROM CLINIC_INDEX A,DEPT_DICT B, " \
                "(SELECT A.CLINIC_TYPE,SUM(B.PRICE) AS PRICE FROM CLINIC_TYPE_SETTING A,CURRENT_PRICE_LIST B  " \
                "WHERE A.PRICE_ITEM=B.ITEM_CODE  GROUP BY A.CLINIC_TYPE) C " \
                "WHERE  A.CLINIC_DEPT=B.DEPT_CODE AND A.CLINIC_TYPE=C.CLINIC_TYPE " \
                "AND A.CLINIC_DEPT LIKE '01%' " \
                "AND A.CLINIC_LABEL LIKE '%{cliniclabel}%' " \
                "ORDER BY A.CLINIC_LABEL".format(cliniclabel=cliniclabel)
        Dbconnect.cursor.execute(sql)
        sql_result = Dbconnect.cursor.fetchall()

        # 创建QStandardItemModel实例
        model = QStandardItemModel()
        # 设置此模型的列标题
        model.setHorizontalHeaderLabels(['价格', '挂号等级', '号别', '科室', '号别类型', '楼层'])
        # 填充单元格数据
        row = len(sql_result)
        column = model.columnCount()
        for i in range(row):
            for j in range(column):
                item = QStandardItem(str(sql_result[i][j]))
                model.setItem(i, j, item)
        self.tableView.setModel(model)
        # 框体不可编辑
        self.tableView.setEditTriggers(QAbstractItemView.EditTrigger.NoEditTriggers)
        self.tableView.show()

    #点击修改按钮,想实现的modify函数,tableview的【价格price】变化,【挂号等级type】同步更新并传入ComboBox
    def cliprice_modify(self):      
        # 定位到【价格】列
        self.tableView.selectColumn(0)
        self.tableView.setSelectionBehavior(QAbstractItemView.SelectColumns)
        # 设置QTableView单列可编辑
        #第0列price可编辑
        delegate = self.tableView.setEditTriggers(QAbstractItemView.EditTrigger.DoubleClicked)
        self.tableView.setItemDelegateForColumn(0, delegate)
        #第1列type可编辑
        delegate2 = ComboBoxDelegate(self.tableView)
        self.tableView.setItemDelegateForColumn(0, delegate2)
        # 信号槽连接
        model.dataChanged.connect(self.onDataChanged)


第一次请人帮忙,价格暂定50-100左右,如果可以发咸鱼,我去拍。价格不对也请指正
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-7-7 11:46:32 | 显示全部楼层
本帖最后由 hejialiangya 于 2023-7-7 11:53 编辑
sfqxx 发表于 2023-7-7 10:58
2#说法错误

新鱼油不可以发悬赏帖,理论上可以发,但只能设置鱼币悬赏


   delegate2.dataChanged.connect(delegate2.onDataChanged)
    ^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'ComboBoxDelegate' object has no attribute 'dataChanged'. Did you mean: 'onDataChanged'?

我.不出dataChanged这个方法


还有一个问题,我从昨天开始就一直想问。
class ComboBoxDelegate(QStyledItemDelegate)
edit不是QComboBox的实例化吗?
为什么里面所有的def,只要是edit.都点不出来,【比如editor.addItem(str(i)),editor.setCurrentIndex(editor.findText(value))】,但是将edit替换成QComboBox就可以正常.出其方法
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-7 12:09:29 | 显示全部楼层
本帖最后由 hejialiangya 于 2023-7-7 13:57 编辑
sfqxx 发表于 2023-7-7 11:48
对不起,我之前犯了一个错误。确实没有`dataChanged`信号,而是应该连接`editor`的`currentTextChanged` ...



调试时断点不触发onDataChanged的事件,
调试会提示:TypeError: ComboBoxDelegate.setModelData() missing 1 required positional argument: 'types'

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-9-22 15:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表