Python 如何通过文本在PyQt中为QTableView创建筛选器
我想创建一个过滤器,可以排序时,一次点击,当双击可以写和过滤它。 我使用的是Python 如何通过文本在PyQt中为QTableView创建筛选器,python,python-3.x,pyqt5,Python,Python 3.x,Pyqt5,我想创建一个过滤器,可以排序时,一次点击,当双击可以写和过滤它。 我使用的是pyqt5,如果您能帮我做这件事的话 您必须实现一个QHeaderView,它具有一个QLineEdit,通过发送修改的列和输入的文本来发出信号,从而根据要求显示 import random from PyQt5 import QtCore, QtGui, QtWidgets class EditableHeaderView(QtWidgets.QHeaderView): textChanged = QtCor
pyqt5
,如果您能帮我做这件事的话
您必须实现一个QHeaderView,它具有一个QLineEdit,通过发送修改的列和输入的文本来发出信号,从而根据要求显示
import random
from PyQt5 import QtCore, QtGui, QtWidgets
class EditableHeaderView(QtWidgets.QHeaderView):
textChanged = QtCore.pyqtSignal(int, str)
def __init__(self, parent=None):
super(EditableHeaderView, self).__init__(QtCore.Qt.Horizontal, parent)
self._is_editable = dict()
self.setSectionsClickable(True)
self._lineedit = QtWidgets.QLineEdit(self, visible=False)
self._lineedit.editingFinished.connect(self._lineedit.hide)
self._lineedit.textChanged.connect(self.on_text_changed)
self.sectionDoubleClicked.connect(self.on_sectionDoubleClicked)
self._current_index = -1
self._filters_text = dict()
def setEditable(self, index, is_editable):
if 0 <= index < self.count():
self._is_editable[index] = is_editable
@QtCore.pyqtSlot()
def hide_lineedit(self):
self._filters_text[self._current_index] = self._lineedit.text()
self._lineedit.hide()
self._current_index = -1
self._lineedit.clear()
@QtCore.pyqtSlot(int)
def on_sectionDoubleClicked(self, index):
self.hide_lineedit()
is_editable = False
if index in self._is_editable:
is_editable = self._is_editable[index]
if is_editable:
geom = QtCore.QRect(self.sectionViewportPosition(index), 0, self.sectionSize(index), self.height())
self._lineedit.setGeometry(geom)
if index in self._filters_text:
self._lineedit.setText(self._filters_text[index])
self._lineedit.show()
self._lineedit.setFocus()
self._current_index = index
self.textChanged.emit(self._current_index, self._lineedit.text())
@QtCore.pyqtSlot(str)
def on_text_changed(self, text):
if self._current_index != -1:
# self.model().setHeaderData(self._current_index, self.orientation(), text)
self.textChanged.emit(self._current_index, text)
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
tableview = QtWidgets.QTableView()
headerview = EditableHeaderView(tableview)
tableview.setHorizontalHeader(headerview)
model = QtGui.QStandardItemModel(20, 10, self)
self._proxy = QtCore.QSortFilterProxyModel(self)
self._proxy.setSourceModel(model)
tableview.setModel(self._proxy)
tableview.setSortingEnabled(True)
for i in range(model.rowCount()):
for j in range(model.columnCount()):
text = ''.join(random.sample(list("abcdefghijklmnopqrstuvwxyz"), 4))
it = QtGui.QStandardItem(text)
model.setItem(i, j, it)
headerview.setEditable(2, True)
headerview.setEditable(4, True)
headerview.setEditable(7, True)
headerview.textChanged.connect(self.on_text_changed)
self.setCentralWidget(tableview)
self.resize(640, 480)
@QtCore.pyqtSlot(int, str)
def on_text_changed(self, col, text):
self._proxy.setFilterKeyColumn(col)
self._proxy.setFilterWildcard("*{}*".format(text) if text else "")
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())
随机导入
从PyQt5导入QtCore、QtGui、QtWidgets
类EditableHeaderView(QtWidgets.QHeaderView):
textChanged=QtCore.pyqtSignal(int,str)
def uuu init uuu(self,parent=None):
超级(EditableHeaderView,self)。\uuuu初始化(QtCore.Qt.Horizontal,父级)
self.\u可编辑=dict()
self.setSectionsClickable(真)
self._lineedit=QtWidgets.QLineEdit(self,visible=False)
self.\u lineedit.editingFinished.connect(self.\u lineedit.hide)
self.\u lineedit.textChanged.connect(self.on\u text\u changed)
self.sectionDoubleClicked.connect(self.on_sectionDoubleClicked)
self.\u当前\u索引=-1
self.\u filters\u text=dict()
def setEditable(自我、索引、可编辑):
如果你能更好地解释你自己。是否要对QTableView标头进行筛选和排序?是的,但可以将标头键入为附加图像。您可以在下图中看到,好的,您希望所有列都具有该功能吗?此表有16列,其中3列将具有该功能