簡體   English   中英

當QSortFilterProxyModel更改PYQT5時,更新QStatusBar中的QWidget

[英]Updating QWidgets in QStatusBar when QSortFilterProxyModel changes PYQT5

我有一個顯示QSortFilterProxyModel的QTableView,我想在要匯總的列上有一個摘要行(在QStatusBar中)。 我設法做到了這一點,但是,每當代理服務器模型更改時,我也想更新這些列的總和。 我現在被困住了,無法繼續進行下去。

這是我的代碼:

from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from pandas import *
import sys


class TBWindow(QMainWindow):
    def __init__(self, parent=None):
        super(TBWindow, self).__init__(parent)

        fList = [['Ajvi', 'Ostatní textil', 'Holesovice', 1, 2],
                 ['Ajvi', 'Sukně', 'Holesovice', 2, 5],
                 ['Ajvi', 'Šaty', 'Holesovice', 2, 0],
                 ['Belusi', 'Brože', 'Fler', 0, 1],
                 ['Belusi', 'Brože', 'Holesovice', 0, 5],
                 ['PP', 'Sukně', 'E-shop', 25, 10],
                 ['PP', 'Sukně', 'Fler', 7, 6],
                 ['PP', 'Sukně', 'Holesovice', 15, 13],
                 ['PP', 'Sukně', 'Other', 6, 2],
                 ['PP', 'Sukně', 'Sashe', 6, 2],
                 ['PP', 'Tašky', 'E-shop', 2, 1],
                 ['PP', 'Tašky', 'Holesovice', 3, 1],
                 ['PP', 'Šaty', 'E-shop', 1, 0]]

        data = DataFrame(fList, columns = ['Seller', 'Section', 'Store', 'Total_pieces: 2017', 'Total_pieces: 2018'])

        self.setWindowTitle('Window')
        self.centralwidget  = QWidget(self)
        self.lineEdit       = QLineEdit(self.centralwidget)
        self.view           = QTableView(self.centralwidget)
        self.comboBox       = QComboBox(self.centralwidget)
        self.label          = QLabel(self.centralwidget)

        self.gridLayout = QGridLayout(self.centralwidget)
        self.gridLayout.addWidget(self.lineEdit, 0, 1, 1, 1)
        self.gridLayout.addWidget(self.view, 1, 0, 1, 3)
        self.gridLayout.addWidget(self.comboBox, 0, 2, 1, 1)
        self.gridLayout.addWidget(self.label, 0, 0, 1, 1)

        self.setCentralWidget(self.centralwidget)
        self.label.setText("Filter")

        self.model = PandasModel(data)
        self.proxy = QSortFilterProxyModel(self)
        self.proxy.setSourceModel(self.model)
        self.view.setModel(self.proxy)

        for column in range(self.view.horizontalHeader().count()):
            self.view.horizontalHeader().setSectionResizeMode(column, QHeaderView.Stretch)

        self.comboBox.addItems(list(data.columns.values))
        self.lineEdit.textChanged.connect(self.on_lineEdit_textChanged)
        self.comboBox.currentIndexChanged.connect(self.on_comboBox_currentIndexChanged)

        lastRow = data.append(data.sum(numeric_only=True), ignore_index=True).tail(1).fillna(0).astype(int).replace(0,'').values
        flat_Row = ['Total: ' + str(item) if item != '' else '' for sublist in lastRow for item in sublist]

        mWdg = QWidget()
        mWdg.setLayout(QHBoxLayout())
        for item in flat_Row:
            mWdg.layout().addWidget(QLabel(item))
        self.statusBar().addPermanentWidget(mWdg, 1)

    @pyqtSlot(str)
    def on_lineEdit_textChanged(self, text):
        search = QRegExp(text, Qt.CaseInsensitive, QRegExp.RegExp)
        self.proxy.setFilterRegExp(search)

    @pyqtSlot(int)
    def on_comboBox_currentIndexChanged(self, index):
        self.proxy.setFilterKeyColumn(index)

class PandasModel(QAbstractTableModel):
    def __init__(self, data, parent=None):
        QAbstractTableModel.__init__(self, parent)
        self._data = data

    def rowCount(self, parent=None):
        return self._data.shape[0]

    def columnCount(self, parent=None):
        return self._data.shape[1]

    def data(self, index, role=Qt.DisplayRole):
        if index.isValid():
            if role == Qt.DisplayRole:
                return str(self._data.iloc[index.row(), index.column()])
        return None

    def headerData(self, col, orientation, role):
        if orientation == Qt.Horizontal and role == Qt.DisplayRole:
            return self._data.columns[col]
        return None

if __name__ == '__main__':

    app = QApplication(sys.argv)
    main = TBWindow()
    main.showMaximized()
    sys.exit(app.exec_())

任何建議如何做到這一點?

通過以以下方式編輯@pyqtSlot和mWdg(至self.mWdg),我設法使其工作:

@pyqtSlot(str)
def on_lineEdit_textChanged(self, text):
    search = QRegExp(text, Qt.CaseInsensitive, QRegExp.RegExp)
    self.proxy.setFilterRegExp(search)

    newModel = self.view.model()
    data = []
    for row in range(newModel.rowCount()):
        rowRes = []
        for column in range(newModel.columnCount()):
            index = newModel.index(row, column)
            item = newModel.data(index)
            if item.isdigit():
                rowRes.append(int(item))
            else:
                rowRes.append(item)
        data.append(rowRes)
    data = DataFrame(data)

    lastRow = data.append(data.sum(numeric_only=True), ignore_index=True).tail(1).fillna('').values
    flat_Row = ['Total: ' + str(int(float(str(item)))) if item != '' else '' for sublist in lastRow for item in sublist]

    self.statusBar().removeWidget(self.mWdg)

    self.mWdg = QWidget()
    self.mWdg.setLayout(QHBoxLayout())
    for item in flat_Row:
        self.mWdg.layout().addWidget(QLabel(item))
    self.statusBar().addPermanentWidget(self.mWdg, 1)

也許,有一種更好的(優雅)方式來進行操作,而不是刪除self.mWdg然后重新創建...。

暫無
暫無

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

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