如何通过QSortFilterProxyModel在QAbstractItemModel中插入行数据?

如何解决如何通过QSortFilterProxyModel在QAbstractItemModel中插入行数据?

这是我昨天提出的一个问题的后续措施:QTreeView QAbstractItemModel parent collapses after deleting item and sometimes crashes

在撰写本文时,我认为添加一些搜索功能会很酷,因此我尝试合并top_k。通过这样做,我现在意识到了完全复杂的事情,但是我真的很喜欢它的发展方向,所以我想跟上它。

现在我想要的许多功能似乎都可以使用,但是尤其是在尝试添加新的行数据时,它似乎崩溃了。而且在不同的时间,我会得到这些错误,QSortFiltertProxyModel(我真的不确定这是哪里来的)

enter image description here

当前的代码:

QSortFilterProxyModel: index from wrong model passed to mapFromSource

根据我发现的内容,我确定需要插入类似于删除行的新行,但是我可以找到的示例只能找到声明要添加新行的情况,但是然后仅通过import sys from functools import partial from PyQt4 import QtGui,QtCore HORIZONTAL_HEADERS = ("Asset Name","Date Added") class AssetClass(object): ''' a trivial custom data object ''' def __init__(self,**kwargs): if not kwargs.get('name') or not kwargs.get('type'): return self.name = kwargs.get('name') self.date_added = kwargs.get('date_added') self.type = kwargs.get('type') def __repr__(self): return "%s - %s %s" % (self.type,self.name,self.date_added) class TreeItem(object): ''' a python object used to return row/column data,and keep note of it's parents and/or children ''' def __init__(self,asset,header,parent_item): self.asset = asset self.parent_item = parent_item self.header = header self.child_items = [] def appendChild(self,item): self.child_items.append(item) def removeChild(self,row): print 'removeChild: item is %s' % self.child_items[row] del self.child_items[row] def child(self,row): return self.child_items[row] def childCount(self): return len(self.child_items) def columnCount(self): return 2 def data(self,column): if self.asset == None: if column == 0: return QtCore.QVariant(self.header) if column == 1: return QtCore.QVariant("") else: if column == 0: return QtCore.QVariant(self.asset.name) if column == 1: return QtCore.QVariant(self.asset.date_added) return QtCore.QVariant() def parent(self): return self.parent_item def row(self): if self.parent_item: return self.parent_item.child_items.index(self) return 0 class TreeModel(QtCore.QAbstractItemModel): ''' a model to display a few names,ordered by sex ''' def __init__(self,parent=None): super(TreeModel,self).__init__(parent) self.assets = [] model_data = (("VEHICLE","Truck",'May 27th,2020'),("VEHICLE","Car",'May 25th,("CHARACTER","Peter","Rachel",'May 29th,("PROP","Chair","Axe",'May 17th,2020')) for asset_type,name,date in model_data: asset = AssetClass(type=asset_type,name=name,date_added=date) self.assets.append(asset) self.rootItem = TreeItem(None,"ALL",None) self.parents = {0: self.rootItem} self.setupModelData() def columnCount(self,parent=None): if parent and parent.isValid(): return parent.internalPointer().columnCount() else: return len(HORIZONTAL_HEADERS) def data(self,index,role): if not index.isValid(): return QtCore.QVariant() item = index.internalPointer() if role == QtCore.Qt.DisplayRole: return item.data(index.column()) if role == QtCore.Qt.UserRole: if item: return item.asset return QtCore.QVariant() def headerData(self,column,orientation,role): if (orientation == QtCore.Qt.Horizontal and role == QtCore.Qt.DisplayRole): try: return QtCore.QVariant(HORIZONTAL_HEADERS[column]) except IndexError: pass return QtCore.QVariant() def index(self,row,parent): if not self.hasIndex(row,parent): return QtCore.QModelIndex() if not parent.isValid(): parent_item = self.rootItem else: parent_item = parent.internalPointer() childItem = parent_item.child(row) if childItem: return self.createIndex(row,childItem) else: return QtCore.QModelIndex() def parent(self,index): if not index.isValid(): return QtCore.QModelIndex() childItem = index.internalPointer() if not childItem: return QtCore.QModelIndex() parent_item = childItem.parent() if parent_item == self.rootItem: return QtCore.QModelIndex() return self.createIndex(parent_item.row(),parent_item) def rowCount(self,parent=QtCore.QModelIndex()): if parent.column() > 0: return 0 if not parent.isValid(): p_Item = self.rootItem else: p_Item = parent.internalPointer() return p_Item.childCount() def setupModelData(self): for asset in self.assets: asset_type = asset.type if not self.parents.has_key(asset_type): new_parent = TreeItem(None,asset_type,self.rootItem) self.rootItem.appendChild(new_parent) self.parents[asset_type] = new_parent parent_item = self.parents[asset_type] new_item = TreeItem(asset,"",parent_item) parent_item.appendChild(new_item) def addSubRow(self,new_asset): asset_type,date = new_asset asset = AssetClass(type=asset_type,date_added=date) parent_item = self.parents[asset_type] already_exists = False for child in parent_item.child_items: if child.asset.name == name and child.asset.type == asset_type: already_exists = True if already_exists: print 'this asset already exists' return new_item = TreeItem(asset,parent_item) parent_item.appendChild(new_item) def removeRows(self,rows,parent=QtCore.QModelIndex()): # Determine parent if parent.internalPointer() is None: parent_node = self.root else: parent_node = parent.internalPointer() # # Delete it from the parent self.beginRemoveRows(parent,row + rows - 1) parent_node.removeChild(row) self.endRemoveRows() return True def searchModel(self,asset): ''' get the modelIndex for a given appointment ''' def searchNode(node): ''' a function called recursively,looking at all nodes beneath node ''' for child in node.child_items: print child.childCount() if asset == child.asset: index = self.createIndex(child.row(),child) return index if child.childCount() > 0: result = searchNode(child) if result: return result retarg = searchNode(self.parents[0]) print retarg return retarg def findAssetName(self,name): app = None for asset in self.assets: if asset.name == name: app = asset break if app != None: index = self.searchModel(app) return (True,index) return (False,None) class TreeView(QtGui.QTreeView): right_button_clicked = QtCore.pyqtSignal() def __init__(self,parent=None): super(TreeView,self).__init__(parent) self.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) self.customContextMenuRequested.connect(self.openMenu) def selectedRows(self): rows = [] for index in self.selectedIndexes(): if index.column() == 0: rows.append(index.row()) print type(rows) return rows def openMenu(self,position): indexes = self.selectedIndexes() if len(indexes) > 0: level = 0 index = indexes[0] while index.parent().isValid(): index = index.parent() level += 1 menu = QtGui.QMenu() editMenu = None if level == 0: editMenu = QtGui.QAction("Edit person",self) menu.addAction(editMenu) elif level == 1: editMenu = QtGui.QAction("Delete",self) menu.addAction(editMenu) elif level == 2: editMenu = QtGui.QAction("Edit object",self) menu.addAction(editMenu) if editMenu: editMenu.triggered.connect(self._on_right_click) menu.exec_(self.viewport().mapToGlobal(position)) def _on_right_click(self): self.right_button_clicked.emit() class Proxy01(QtGui.QSortFilterProxyModel): def __init__(self): super(Proxy01,self).__init__() self.keyword = None self.searched_parents = None def setFilterRegExp(self,pattern): if isinstance(pattern,str): pattern = QtCore.QRegExp(pattern,QtCore.Qt.CaseInsensitive,QtCore.QRegExp.FixedString) super(Proxy01,self).setFilterRegExp(pattern) def setData(self,value,role=QtCore.Qt.EditRole): # Call source model's setData() super(Proxy01,self).setData(index,role) self.invalidate() def _accept_index(self,idx): if idx.isValid(): text = idx.data(QtCore.Qt.DisplayRole).toString() if self.filterRegExp().indexIn(text) >= 0: return True for row in range(idx.model().rowCount(idx)): if self._accept_index(idx.model().index(row,idx)): return True return False def filterAcceptsRow(self,source_row,source_parent): idx = self.sourceModel().index(source_row,source_parent) return self._accept_index(idx) class Dialog(QtGui.QDialog): add_signal = QtCore.pyqtSignal(int) def __init__(self,parent=None): super(Dialog,self).__init__(parent) self.setMinimumSize(300,150) self.model = TreeModel() self.proxy1 = Proxy01() self.proxy1.setSourceModel(self.model) self.proxy1.setFilterCaseSensitivity(QtCore.Qt.CaseInsensitive) layout = QtGui.QVBoxLayout(self) self.tree_view = TreeView(self) self.tree_view.setModel(self.proxy1) self.tree_view.setAlternatingRowColors(True) self.tree_view.right_button_clicked.connect(self.deleteMenuButtonClicked) layout.addWidget(self.tree_view) label = QtGui.QLabel("Search for the following person") layout.addWidget(label) search_layout = QtGui.QHBoxLayout(self) self.search_line_edit = QtGui.QLineEdit() self.search_line_edit.textChanged.connect(self.updateFilter) search_layout.addWidget(self.search_line_edit) search_line_button = QtGui.QPushButton('Search') search_line_button.setMaximumWidth(75) search_layout.addWidget(search_line_button) layout.addLayout(search_layout) self.add_button = QtGui.QPushButton("Add \"Character - Smith\"") layout.addWidget(self.add_button) QtCore.QObject.connect(self.add_button,QtCore.SIGNAL("clicked()"),self.addButtonClicked) self.delete_button = QtGui.QPushButton("Delete Selected") layout.addWidget(self.delete_button) QtCore.QObject.connect(self.delete_button,self.deleteButtonClicked) self.but = QtGui.QPushButton("Clear Selection") layout.addWidget(self.but) QtCore.QObject.connect(self.but,self.tree_view.clearSelection) QtCore.QObject.connect(self.tree_view,QtCore.SIGNAL("clicked(QModelIndex)"),self.row_clicked) def row_clicked(self,index): ''' when a row is clicked... show the name ''' real_index = self.tree_view.model().mapToSource(index) print self.tree_view.model().sourceModel().data(real_index,QtCore.Qt.UserRole) def but_clicked(self): ''' when a name button is clicked,I iterate over the model,find the person with this name,and set the treeviews current item ''' name = self.sender().text() print "BUTTON CLICKED:",name result,index = self.model.findAssetName(name) if result: if index: self.tree_view.setCurrentIndex(index) return self.tree_view.clearSelection() def addButtonClicked(self): new_asset = ("CHARACTER","Smith",'May 28th,2020') self.tree_view.model().sourceModel().addSubRow(new_asset) self.tree_view.model().sourceModel().layoutChanged.emit() @QtCore.pyqtSlot() def deleteMenuButtonClicked(self): self.deleteButtonClicked() def deleteButtonClicked(self): model = self.tree_view.model() current = self.tree_view.currentIndex() model.removeRows(current.row(),1,model.parent(current)) def customFilter(self): self.proxy1.setKeyword(self.search_line_edit.text()) def updateFilter(self,text): self.proxy1.setFilterRegExp(text) if __name__ == "__main__": app = QtGui.QApplication(sys.argv) dialog = Dialog() dialog.show() sys.exit(app.exec_()) “输入”数据。但是我宁愿直接传递一个edit()对象。

在实际传递自定义对象时,如何利用AssetClass方法格式?

解决方法

经过一番检查,我能够使它正常工作,而没有任何明显的错误。我基本上可以通过直接调整源模型并在invalidate()上调用QSortFilterProxyModel来插入项目,这似乎基本上只是重绘/刷新它(尽管不确定这是否正确)。我做了与删除现有行类似的操作。

完整代码:

# http://rowinggolfer.blogspot.com/2010/05/qtreeview-and-qabractitemmodel-example.html

import sys
from functools import partial
from PyQt4 import QtGui,QtCore

HORIZONTAL_HEADERS = ("Asset Name","Date Added")


class AssetClass(object):
    '''
    a trivial custom data object
    '''

    def __init__(self,**kwargs):
        if not kwargs.get('name') or not kwargs.get('type'):
            return
        self.name = kwargs.get('name')
        self.date_added = kwargs.get('date_added')
        self.type = kwargs.get('type')

    def __repr__(self):
        return "%s - %s %s" % (self.type,self.name,self.date_added)


class TreeItem(object):
    '''
    a python object used to return row/column data,and keep note of
    it's parents and/or children
    '''

    def __init__(self,asset,header,parent_item):
        self.asset = asset
        self.parent_item = parent_item
        self.header = header
        self.child_items = []

    def appendChild(self,item):
        self.child_items.append(item)

    def removeChild(self,item):
        self.child_items.remove(item)

    def child(self,row):
        return self.child_items[row]

    def childCount(self):
        return len(self.child_items)

    def columnCount(self):
        return 2

    def data(self,column):
        if self.asset == None:
            if column == 0:
                return QtCore.QVariant(self.header)
            if column == 1:
                return QtCore.QVariant("")
        else:
            if column == 0:
                return QtCore.QVariant(self.asset.name)
            if column == 1:
                return QtCore.QVariant(self.asset.date_added)
        return QtCore.QVariant()

    def parent(self):
        return self.parent_item

    def row(self):
        if self.parent_item:
            return self.parent_item.child_items.index(self)
        return 0


class TreeModel(QtCore.QAbstractItemModel):
    '''
    a model to display a few names,ordered by sex
    '''

    def __init__(self,parent=None):
        super(TreeModel,self).__init__(parent)
        self.assets = []
        model_data = (("VEHICLE","Truck",'May 27th,2020'),("VEHICLE","Car",'May 25th,("CHARACTER","Peter","Rachel",'May 29th,("PROP","Chair","Axe",'May 17th,2020'))
        for asset_type,name,date in model_data:
            asset = AssetClass(type=asset_type,name=name,date_added=date)
            self.assets.append(asset)

        self.rootItem = TreeItem(None,"ALL",None)
        self.parents = {0: self.rootItem}
        self.setupModelData()

    def columnCount(self,parent=None):
        if parent and parent.isValid():
            return parent.internalPointer().columnCount()
        else:
            return len(HORIZONTAL_HEADERS)

    def data(self,index,role):
        if not index.isValid():
            return QtCore.QVariant()

        item = index.internalPointer()
        if role == QtCore.Qt.DisplayRole:
            return item.data(index.column())
        if role == QtCore.Qt.UserRole:
            if item:
                return item.asset

        return QtCore.QVariant()

    def headerData(self,column,orientation,role):
        if (orientation == QtCore.Qt.Horizontal and
                role == QtCore.Qt.DisplayRole):
            try:
                return QtCore.QVariant(HORIZONTAL_HEADERS[column])
            except IndexError:
                pass

        return QtCore.QVariant()

    def index(self,row,parent):
        if not self.hasIndex(row,parent):
            return QtCore.QModelIndex()

        if not parent.isValid():
            parent_item = self.rootItem
        else:
            parent_item = parent.internalPointer()

        childItem = parent_item.child(row)
        if childItem:
            return self.createIndex(row,childItem)
        else:
            return QtCore.QModelIndex()

    def parent(self,index):
        if not index.isValid():
            return QtCore.QModelIndex()

        childItem = index.internalPointer()
        if not childItem:
            return QtCore.QModelIndex()

        parent_item = childItem.parent()

        if parent_item == self.rootItem:
            return QtCore.QModelIndex()

        return self.createIndex(parent_item.row(),parent_item)

    def rowCount(self,parent=QtCore.QModelIndex()):
        if parent.column() > 0:
            return 0
        if not parent.isValid():
            p_Item = self.rootItem
        else:
            p_Item = parent.internalPointer()
        return p_Item.childCount()

    def setupModelData(self):
        for asset in self.assets:
            asset_type = asset.type

            if not self.parents.has_key(asset_type):
                new_parent = TreeItem(None,asset_type,self.rootItem)
                self.rootItem.appendChild(new_parent)

                self.parents[asset_type] = new_parent

            parent_item = self.parents[asset_type]
            new_item = TreeItem(asset,"",parent_item)
            parent_item.appendChild(new_item)

    def addSubRow(self,new_asset):
        asset_type,date = new_asset
        asset = AssetClass(type=asset_type,date_added=date)
        parent_item = self.parents[asset_type]
        already_exists = False
        for child in parent_item.child_items:
            if child.asset.name == name and child.asset.type == asset_type:
                already_exists = True
        if already_exists:
            print 'this asset already exists'
            return
        new_item = TreeItem(asset,parent_item)
        parent_item.appendChild(new_item)

    def customRemoveRow(self,rowIndex):
        child_tree_item = rowIndex.internalPointer()
        asset_type = rowIndex.parent().data().toString()
        parent_item = self.parents[str(asset_type)]
        self.beginRemoveRows(rowIndex.parent(),rowIndex.row(),rowIndex.row() + 1)
        parent_item.removeChild(child_tree_item)
        self.endRemoveRows()

    def searchModel(self,asset):
        '''
        get the modelIndex for a given appointment
        '''

        def searchNode(node):
            '''
            a function called recursively,looking at all nodes beneath node
            '''
            for child in node.child_items:
                print child.childCount()
                if asset == child.asset:
                    index = self.createIndex(child.row(),child)
                    return index

                if child.childCount() > 0:
                    result = searchNode(child)
                    if result:
                        return result

        retarg = searchNode(self.parents[0])
        print retarg
        return retarg

    def findAssetName(self,name):
        app = None
        for asset in self.assets:
            if asset.name == name:
                app = asset
                break
        if app != None:
            index = self.searchModel(app)
            return (True,index)
        return (False,None)


class TreeView(QtGui.QTreeView):
    right_button_clicked = QtCore.pyqtSignal()

    def __init__(self,parent=None):
        super(TreeView,self).__init__(parent)
        self.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
        self.customContextMenuRequested.connect(self.openMenu)

    def selectedRows(self):
        rows = []
        for index in self.selectedIndexes():
            if index.column() == 0:
                rows.append(index.row())
        print type(rows)
        return rows

    def openMenu(self,position):
        indexes = self.selectedIndexes()
        if len(indexes) > 0:

            level = 0
            index = indexes[0]
            while index.parent().isValid():
                index = index.parent()
                level += 1

        menu = QtGui.QMenu()
        editMenu = None
        if level == 0:
            editMenu = QtGui.QAction("Edit person",self)
            menu.addAction(editMenu)
        elif level == 1:
            editMenu = QtGui.QAction("Delete",self)
            menu.addAction(editMenu)
        elif level == 2:
            editMenu = QtGui.QAction("Edit object",self)
            menu.addAction(editMenu)

        if editMenu:
            editMenu.triggered.connect(self._on_right_click)

        menu.exec_(self.viewport().mapToGlobal(position))

    def _on_right_click(self):
        self.right_button_clicked.emit()

class Proxy01(QtGui.QSortFilterProxyModel):
    def __init__(self):
        super(Proxy01,self).__init__()
        self.keyword = None
        self.searched_parents = None

    def setFilterRegExp(self,pattern):
        if isinstance(pattern,str):
            pattern = QtCore.QRegExp(pattern,QtCore.Qt.CaseInsensitive,QtCore.QRegExp.FixedString)
        super(Proxy01,self).setFilterRegExp(pattern)

    def _accept_index(self,idx):
        if idx.isValid():
            text = idx.data(QtCore.Qt.DisplayRole).toString()
            if self.filterRegExp().indexIn(text) >= 0:
                return True
            for row in range(idx.model().rowCount(idx)):
                if self._accept_index(idx.model().index(row,idx)):
                    return True
        return False

    def filterAcceptsRow(self,source_row,source_parent):
        idx = self.sourceModel().index(source_row,source_parent)
        return self._accept_index(idx)


class Dialog(QtGui.QDialog):
    add_signal = QtCore.pyqtSignal(int)

    def __init__(self,parent=None):
        super(Dialog,self).__init__(parent)
        self.setMinimumSize(300,150)

        self.model = TreeModel()
        self.proxy1 = Proxy01()
        self.proxy1.setSourceModel(self.model)
        self.proxy1.setFilterCaseSensitivity(QtCore.Qt.CaseInsensitive)
        layout = QtGui.QVBoxLayout(self)

        self.tree_view = TreeView(self)
        self.tree_view.setModel(self.proxy1)
        self.tree_view.setAlternatingRowColors(True)
        self.tree_view.right_button_clicked.connect(self.deleteMenuButtonClicked)
        layout.addWidget(self.tree_view)

        label = QtGui.QLabel("Search for the following person")
        layout.addWidget(label)

        search_layout = QtGui.QHBoxLayout(self)

        self.search_line_edit = QtGui.QLineEdit()
        self.search_line_edit.textChanged.connect(self.updateFilter)
        search_layout.addWidget(self.search_line_edit)

        search_line_button = QtGui.QPushButton('Search')
        search_line_button.setMaximumWidth(75)
        search_layout.addWidget(search_line_button)

        layout.addLayout(search_layout)

        self.add_button = QtGui.QPushButton("Add \"Character - Smith\"")
        layout.addWidget(self.add_button)
        QtCore.QObject.connect(self.add_button,QtCore.SIGNAL("clicked()"),self.addButtonClicked)

        self.delete_button = QtGui.QPushButton("Delete Selected")
        layout.addWidget(self.delete_button)
        QtCore.QObject.connect(self.delete_button,self.deleteButtonClicked)

        self.but = QtGui.QPushButton("Clear Selection")
        layout.addWidget(self.but)
        QtCore.QObject.connect(self.but,self.tree_view.clearSelection)

        QtCore.QObject.connect(self.tree_view,QtCore.SIGNAL("clicked(QModelIndex)"),self.row_clicked)

    def row_clicked(self,index):
        '''
        when a row is clicked... show the name
        '''
        real_index = self.tree_view.model().mapToSource(index)
        print self.tree_view.model().sourceModel().data(real_index,QtCore.Qt.UserRole)

    def but_clicked(self):
        '''
        when a name button is clicked,I iterate over the model,find the person with this name,and set the treeviews current item
        '''
        name = self.sender().text()
        print "BUTTON CLICKED:",name
        result,index = self.model.findAssetName(name)
        if result:
            if index:
                self.tree_view.setCurrentIndex(index)
                return
        self.tree_view.clearSelection()

    def addButtonClicked(self):
        new_asset = ("CHARACTER","Smith",'May 28th,2020')
        self.model.addSubRow(new_asset)
        self.proxy1.invalidate()

    @QtCore.pyqtSlot()
    def deleteMenuButtonClicked(self):
        self.deleteButtonClicked()

    def deleteButtonClicked(self):
        current = self.tree_view.currentIndex()
        source_index = self.proxy1.mapToSource(current)
        self.model.customRemoveRow(source_index)
        self.proxy1.invalidate()

    def customFilter(self):
        self.proxy1.setKeyword(self.search_line_edit.text())

    def updateFilter(self,text):
        self.proxy1.setFilterRegExp(text)

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    dialog = Dialog()
    dialog.show()
    sys.exit(app.exec_())

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-