亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用 QSqlTableModel 為 Qtableview 創建過濾器行?

如何使用 QSqlTableModel 為 Qtableview 創建過濾器行?

12345678_0001 2023-03-30 09:47:02
是否可以使用 QSqlTableModel 為 Qtableview 創建行過濾器。我正在唱“QSqlTableModel”來顯示來自正在工作的 SQLite 的 Qtableview 上的數據。但我正在嘗試過濾行。當我執行代碼時,我遇到的錯誤是第 44 行,在 for row in range(self.model.rowCount()) AttributeError: 'QSqlTableModel' object has no attribute 'item'我試過但沒有得到任何解決方案??梢杂?QSqlTableModel 來實現嗎?當我點擊 Qtableview 的任何列時,我想顯示來自 tableview 的過濾項目。我將 Qtableview 與 QSqlTableModel 一起使用。我想做的就像圖片中顯示的那樣from PyQt5 import QtCore, QtGui, QtWidgets, QtSqlfrom PyQt5.QtSql import *class myWindow(QtWidgets.QMainWindow):    def __init__(self, parent=None):        super(myWindow, self).__init__(parent)        self.centralwidget  = QtWidgets.QWidget(self)        self.view           = QtWidgets.QTableView(self.centralwidget)        self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)        self.gridLayout.addWidget(self.view, 1, 0, 1, 3)        self.setCentralWidget(self.centralwidget)       # self.model = QtGui.QStandardItemModel(self)        db = QSqlDatabase.addDatabase("QSQLITE")        db.setDatabaseName("model.db")        db.open()        self.model = QSqlTableModel(self)        self.model.setTable("sheet")        self.model.select()        self.view.setModel(self.model)        self.proxy = QtCore.QSortFilterProxyModel(self)        self.proxy.setSourceModel(self.model)        self.view.setModel(self.proxy)        self.horizontalHeader = self.view.horizontalHeader()        self.horizontalHeader.sectionClicked.connect(self.on_view_horizontalHeader_sectionClicked)
查看完整描述

1 回答

?
慕后森

TA貢獻1802條經驗 獲得超5個贊

QSortFilterProxyModel 的實現是為了比較字符串,但在您的情況下,您有不同類型的值,因此必須實現自定義過濾器。


為了處理與每個選項關聯的不同類型的數據,然后在 QAction 中分別使用 setData() 和 data() 存儲和訪問值。


另一方面,我認為沒有必要使用 QSignalMapper 或信號,因為如果 exec_() 方法被選中則返回 QAction,否則返回 None。


要訪問每個項目的值,必須使用模型的 data() 方法:


from PyQt5 import QtCore, QtGui, QtWidgets, QtSql



class FilterProxyModel(QtCore.QSortFilterProxyModel):

    def __init__(self, parent=None):

        super().__init__(parent)

        self._filter_value = None


    @property

    def filter_value(self):

        return self._filter_value


    @filter_value.setter

    def filter_value(self, value):

        self._filter_value = value

        self.invalidateFilter()


    def filterAcceptsRow(self, sourceRow, sourceParent):

        if self.filter_value is None:

            return True

        value = (

            self.sourceModel()

            .index(sourceRow, self.filterKeyColumn(), sourceParent)

            .data(self.filterRole())

        )

        return value == self.filter_value



class myWindow(QtWidgets.QMainWindow):

    def __init__(self, parent=None):

        super(myWindow, self).__init__(parent)

        self.centralwidget = QtWidgets.QWidget(self)

        self.view = QtWidgets.QTableView(self.centralwidget)


        self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)


        self.gridLayout.addWidget(self.view, 1, 0, 1, 3)


        self.setCentralWidget(self.centralwidget)


        db = QtSql.QSqlDatabase.addDatabase("QSQLITE")

        db.setDatabaseName("model.db")

        db.open()


        self.model = QtSql.QSqlTableModel(self)

        self.model.setTable("sheet")

        self.model.select()

        self.view.setModel(self.model)


        self.proxy = FilterProxyModel(self)

        self.proxy.setSourceModel(self.model)


        self.view.setModel(self.proxy)


        self.horizontalHeader = self.view.horizontalHeader()

        self.horizontalHeader.sectionClicked.connect(

            self.on_view_horizontalHeader_sectionClicked

        )


    @QtCore.pyqtSlot(int)

    def on_view_horizontalHeader_sectionClicked(self, logicalIndex):

        menu = QtWidgets.QMenu(self)


        values = []


        for row in range(self.model.rowCount()):

            value = self.model.index(row, logicalIndex).data(self.proxy.filterRole())

            values.append(value)


        action_all = QtWidgets.QAction("All", self)

        action_all.setData(None)

        menu.addAction(action_all)

        menu.addSeparator()


        for value in sorted(list(set(values))):

            action = QtWidgets.QAction(str(value), self)

            action.setData(value)

            menu.addAction(action)


        headerPos = self.view.mapToGlobal(self.horizontalHeader.pos())

        posY = headerPos.y() + self.horizontalHeader.height()

        posX = headerPos.x() + self.horizontalHeader.sectionPosition(logicalIndex)


        action = menu.exec_(QtCore.QPoint(posX, posY))

        if action is not None:

            self.proxy.setFilterKeyColumn(logicalIndex)

            self.proxy.filter_value = action.data()



if __name__ == "__main__":

    import sys


    app = QtWidgets.QApplication(sys.argv)

    main = myWindow()

    main.show()

    main.resize(400, 600)

    sys.exit(app.exec_())



查看完整回答
反對 回復 2023-03-30
  • 1 回答
  • 0 關注
  • 333 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號