簡體   English   中英

在 QTableWidget 中使用 ComboBoxes 時數據不會保存

[英]Data will not save when using ComboBoxes inside QTableWidget

import sys
from PyQt6 import QtWidgets
from PyQt6.QtWidgets import QApplication, QItemDelegate, QWidget, QTableWidget, QTableWidgetItem, QPushButton, QHeaderView, QHBoxLayout, QVBoxLayout
from PyQt6.QtCore import Qt
import pandas as pd


class ComboBoxDelegate(QItemDelegate):
    def __init__(self, parent=None):
        super(ComboBoxDelegate, self).__init__(parent)
        self.items = []

    def setItems(self, items):
        self.items = items

    def createEditor(self, widget, option, index):
        editor = QtWidgets.QComboBox(widget)
        editor.addItems(self.items)
        return editor

    def setEditorData(self, editor, index):
        value = index.model().data(index, Qt.ItemDataRole.EditRole)
        if value:
            editor.setCurrentText(str(value))
            print("Data Changed")

    def setModelData(self, editor, model, index):
        model.setData(index, editor.currentIndex(), Qt.ItemDataRole.EditRole)

    def updateEditorGeometry(self, editor, option, index):
        editor.setGeometry(option.rect)

class MyApp(QWidget):
    def __init__(self):
        super().__init__()
        self.window_width, self.window_height = 700, 500
        self.resize(self.window_width, self.window_height)
        self.setWindowTitle('Load Excel (or CSV) data to QTableWidget')

        layout = QVBoxLayout()
        self.setLayout(layout)

        self.table = QTableWidget()
        layout.addWidget(self.table)

        self.button = QPushButton('&Load Data')
        self.button.clicked.connect(lambda _, xl_path=excel_file_path,: self.loadExcelData(xl_path))
        layout.addWidget(self.button)

    def loadExcelData(self, excel_file_dir):
        df = pd.read_csv(excel_file_dir)
        if df.size == 0:
            return

        df.fillna('', inplace=True)
        self.table.setRowCount(df.shape[0])
        self.table.setColumnCount(df.shape[1])
        self.table.setHorizontalHeaderLabels(df.columns)

        # returns pandas array object
        for row in df.iterrows():
            values = row[1]
            for col_index, value in enumerate(values):
                if isinstance(value, (float, int)):
                    value = '{0:0,.0f}'.format(value)
                tableItem = QTableWidgetItem(str(value))
                self.table.setItem(row[0], col_index, tableItem)
        self.create_delegate(self.table)
        self.table.setColumnWidth(2, 300)
    
    def create_delegate(self, table):
        test_del = ComboBoxDelegate()
        test_list = ["Gravity Main", "Manhole", "Lateral"]
        test_del.setItems(test_list)
        table.setItemDelegateForColumn(0, test_del)


if __name__ == '__main__':
    
    excel_file_path = "[Your CSV]"

    app = QApplication(sys.argv)
    app.setStyleSheet('''
        QWidget {
            font-size: 17px;
        }
    ''')
    
    myApp = MyApp()
    myApp.show()

    try:
        sys.exit(app.exec())
    except SystemExit:
        print('Closing Window...')

延伸到上一個問題
將文件目錄更改為隨機 csv。
這會填充 QTableWidget 並與我的主程序執行相同的操作。
QTableWidget 不保存更改。
我的目標是能夠根據加載的 csv 使用不同的選項填充多個列。 我有一個工作版本,但使用 QTableView 而不是 QTableWidget,我正在努力轉移該進度。

根據PyQt 維護者的說法,該問題是由代碼生成錯誤引起的。

它應該已在以下 PyQt6 快照中修復,因此如果您進行 pip 更新,您很可能已經獲得工作版本,否則請等待幾天並密切關注官方網站的更新日志。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM