本文介绍了想根据组合框和搜索栏过滤行我也想用选择取消全选和在pyQt5中搜索使复选框多选的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
这里,我有一个tableView,上传按钮,两个组合框,当用户上传一个csv文件时会自动填充还有一个搜索栏(QLineEdit_2),我想根据两个复选框和搜索栏过滤行(QLineEdit_2),我也想用全选功能使组合框多选,并用搜索功能完全取消全选.
Here, I have one tableView, Upload Button ,two ComboBoxes which will be filled automatically when user upload a csv file also there is a search bar (QLineEdit_2) , I want to filter rows on the basis of two checkBoxes and search bar (QLineEdit_2), also I want to make comboBoxes multiselect with select all and deselect all with Search functionality altogether.
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtGui import QIcon, QStandardItemModel
from PyQt5.QtWidgets import QCompleter, QFileDialog, QTableWidget
from PyQt5.QtCore import Qt, QDir
import pandas as pd
#--------------------------------------------------- Pandas Model ------------------------------------------
class PandasModel(QtCore.QAbstractTableModel):
def __init__(self, df=pd.DataFrame(), parent=None):
QtCore.QAbstractTableModel.__init__(self, parent=parent)
self._df = df.copy()
self.bolds = dict()
def toDataFrame(self):
return self._df.copy()
def headerData(self, section, orientation, role=QtCore.Qt.DisplayRole):
if orientation == QtCore.Qt.Horizontal:
if role == QtCore.Qt.DisplayRole:
try:
return self._df.columns.tolist()[section]
except (IndexError,):
return QtCore.QVariant()
elif role == QtCore.Qt.FontRole:
return self.bolds.get(section, QtCore.QVariant())
elif orientation == QtCore.Qt.Vertical:
if role == QtCore.Qt.DisplayRole:
try:
# return self.df.index.tolist()
return self._df.index.tolist()[section]
except (IndexError,):
return QtCore.QVariant()
return QtCore.QVariant()
def setFont(self, section, font):
self.bolds[section] = font
self.headerDataChanged.emit(QtCore.Qt.Horizontal, 0, self.columnCount())
def data(self, index, role=QtCore.Qt.DisplayRole):
if role != QtCore.Qt.DisplayRole:
return QtCore.QVariant()
if not index.isValid():
return QtCore.QVariant()
return QtCore.QVariant(str(self._df.iloc[index.row(), index.column()]))
def setData(self, index, value, role):
row = self._df.index[index.row()]
col = self._df.columns[index.column()]
if hasattr(value, "toPyObject"):
# PyQt4 gets a QVariant
value = value.toPyObject()
else:
# PySide gets an unicode
dtype = self._df[col].dtype
if dtype != object:
value = None if value == "" else dtype.type(value)
self._df.set_value(row, col, value)
return True
def rowCount(self, parent=QtCore.QModelIndex()):
return len(self._df.index)
def columnCount(self, parent=QtCore.QModelIndex()):
return len(self._df.columns)
def sort(self, column, order):
colname = self._df.columns.tolist()[column]
self.layoutAboutToBeChanged.emit()
self._df.sort_values(
colname, ascending=order == QtCore.Qt.AscendingOrder, inplace=True
)
self._df.reset_index(inplace=True, drop=True)
self.layoutChanged.emit()
#--------------------------------------------------- Checkable Pandas Model ------------------------------
class CheckablePandasModel(PandasModel):
def __init__(self, df=pd.DataFrame(), parent=None):
super().__init__(df, parent)
self.checkable_values = set()
self._checkable_column = -1
@property
def checkable_column(self):
return self._checkable_column
@checkable_column.setter
def checkable_column(self, column):
if self.checkable_column == column:
return
last_column = self.checkable_column
self._checkable_column = column
if last_column == -1:
self.beginInsertColumns(
QtCore.QModelIndex(), self.checkable_column, self.checkable_column
)
self.endInsertColumns()
elif self.checkable_column == -1:
self.beginRemoveColumns(QtCore.QModelIndex(), last_column, last_column)
self.endRemoveColumns()
for c in (last_column, column):
if c > 0:
self.dataChanged.emit(
self.index(0, c), self.index(self.columnCount() - 1, c)
)
def columnCount(self, parent=QtCore.QModelIndex()):
return super().columnCount(parent) + (1 if self.checkable_column != -1 else 0)
def data(self, index, role=QtCore.Qt.DisplayRole):
if self.checkable_column != -1:
row, col = index.row(), index.column()
if col == self.checkable_column:
if role == QtCore.Qt.CheckStateRole:
return (
QtCore.Qt.Checked
if row in self.checkable_values
else QtCore.Qt.Unchecked
)
return QtCore.QVariant()
if col > self.checkable_column:
index = index.sibling(index.row(), col - 1)
return super().data(index, role)
def setData(self, index, value, role):
if self.checkable_column != -1:
row, col = index.row(), index.column()
if col == self.checkable_column:
if role == QtCore.Qt.CheckStateRole:
if row in self.checkable_values:
self.checkable_values.discard(row)
else:
self.checkable_values.add(row)
self.dataChanged.emit(index, index, (role,))
return True
return False
if col > self.checkable_column:
index = index.sibling(index.row(), col - 1)
return super().setData(index, value, role)
def headerData(self, section, orientation, role=QtCore.Qt.DisplayRole):
if self.checkable_column != -1:
if section == self.checkable_column and orientation == QtCore.Qt.Horizontal:
return QtCore.QVariant()
if section > self.checkable_column and orientation == QtCore.Qt.Horizontal:
section -= 1
return super().headerData(section, orientation, role)
def flags(self, index):
if self.checkable_column != -1:
col = index.column()
if col == self.checkable_column:
return QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsEnabled
if col > self.checkable_column:
index = index.sibling(index.row(), col - 1)
return super().flags(index)
#--------------------------------------------------
class CustomProxyModel(QtCore.QSortFilterProxyModel):
def __init__(self, parent=None):
super().__init__()
self._filters = dict()
@property
def filters(self):
return self._filters
def setFilter(self, expresion, column):
if expresion:
self.filters[column] = expresion
elif column in self.filters:
del self.filters[column]
self.invalidateFilter()
def filterAcceptsRow(self, source_row, source_parent):
for column, expresion in self.filters.items():
text = self.sourceModel().index(source_row, column, source_parent).data()
regex = QtCore.QRegExp(
expresion, QtCore.Qt.CaseInsensitive, QtCore.QRegExp.RegExp
)
if regex.indexIn(text) == -1:
return False
return True
#------------------------------------------------- Main Odject Class --------------------------------------------
class Ui_Dialog(object):
def setupUi(self, Dialog):
Dialog.setObjectName("Dialog")
Dialog.resize(1858, 1102)
self.gridLayoutWidget = QtWidgets.QWidget(Dialog)
self.gridLayoutWidget.setGeometry(QtCore.QRect(320, 129, 1521, 961))
self.gridLayoutWidget.setObjectName("gridLayoutWidget")
self.gridLayout = QtWidgets.QGridLayout(self.gridLayoutWidget)
self.gridLayout.setContentsMargins(0, 0, 0, 0)
self.gridLayout.setObjectName("gridLayout")
self.tableView = QtWidgets.QTableView(self.gridLayoutWidget)
font = QtGui.QFont()
font.setBold(True)
font.setWeight(75)
#----------------------------------------- tableView to display dataframe ------------------------------
self.tableView.setFont(font)
self.tableView.setAutoFillBackground(False)
self.tableView.setObjectName("tableView")
self.gridLayout.addWidget(self.tableView, 0, 0, 1, 1)
self.pushButton = QtWidgets.QPushButton(Dialog)
self.pushButton.setEnabled(True)
self.pushButton.setGeometry(QtCore.QRect(10, 150, 301, 51))
font = QtGui.QFont()
font.setPointSize(12)
font.setBold(True)
font.setWeight(75)
#---------------------------------------------- upload Button --------------------------------------------
self.pushButton.setFont(font)
self.pushButton.setObjectName("pushButton")
self.pushButton.clicked.connect(self.loadFile)
self.lineEdit = QtWidgets.QLineEdit(Dialog)
self.lineEdit.setGeometry(QtCore.QRect(322, 11, 1521, 51))
font = QtGui.QFont()
font.setPointSize(9)
font.setBold(True)
font.setWeight(75)
#------------------------------------ Uploaded File Name Display in LineEdit ------------------------------
self.lineEdit.setFont(font)
self.lineEdit.setObjectName("lineEdit")
self.lineEdit_2 = QtWidgets.QLineEdit(Dialog)
self.lineEdit_2.setGeometry(QtCore.QRect(322, 71, 1521, 51))
font = QtGui.QFont()
font.setPointSize(12)
font.setBold(True)
font.setWeight(75)
#-------------------------------------------- Search in LineEdit ------------------------------------------
self.lineEdit_2.setFont(font)
self.lineEdit_2.setObjectName("lineEdit_2")
self.pushButton_2 = QtWidgets.QPushButton(Dialog)
self.pushButton_2.setGeometry(QtCore.QRect(10, 220, 301, 51))
font = QtGui.QFont()
font.setPointSize(12)
font.setBold(True)
font.setWeight(75)
#------------------------------------------- Validate Button -----------------------------------------------
self.pushButton_2.setFont(font)
self.pushButton_2.setObjectName("pushButton_2")
self.label = QtWidgets.QLabel(Dialog)
self.label.setGeometry(QtCore.QRect(20, 290, 151, 21))
font = QtGui.QFont()
font.setPointSize(12)
font.setBold(True)
font.setWeight(75)
self.label.setFont(font)
self.label.setObjectName("label")
#------------------------------------------ Select Date ComboBox -----------------------------------------------------
self.comboBox = QtWidgets.QComboBox(Dialog)
self.comboBox.setGeometry(QtCore.QRect(10, 330, 301, 51))
self.comboBox.setObjectName("comboBox")
self.label_2 = QtWidgets.QLabel(Dialog)
self.label_2.setGeometry(QtCore.QRect(20, 410, 221, 21))
font = QtGui.QFont()
font.setPointSize(12)
font.setBold(True)
font.setWeight(75)
self.label_2.setFont(font)
self.label_2.setObjectName("label_2")
#------------------------------------------- Select Facility Name ComboBox --------------------------------------
self.comboBox_2 = QtWidgets.QComboBox(Dialog)
self.comboBox_2.setGeometry(QtCore.QRect(10, 450, 301, 51))
self.comboBox_2.setObjectName("comboBox_2")
# self.label_3 = QtWidgets.QLabel(Dialog)
# self.label_3.setGeometry(QtCore.QRect(80, 10, 121, 121))
# self.label_3.setText("")
# self.label_3.setPixmap(QtGui.QPixmap("../../../../Pictures/74067_web (2).jpg"))
# self.label_3.setObjectName("label_3")
self.pushButton_3 = QtWidgets.QPushButton(Dialog)
self.pushButton_3.setGeometry(QtCore.QRect(10, 520, 301, 51))
font = QtGui.QFont()
font.setPointSize(12)
font.setBold(True)
font.setWeight(75)
#--------------------------------------------- Reset Button ------------------------------------------------
self.pushButton_3.setFont(font)
self.pushButton_3.setObjectName("pushButton_3")
self.pushButton_4 = QtWidgets.QPushButton(Dialog)
self.pushButton_4.setGeometry(QtCore.QRect(10, 590, 301, 51))
font = QtGui.QFont()
font.setPointSize(12)
font.setBold(True)
font.setWeight(75)
#---------------------------------------------- Export Button ------------------------------------------
self.pushButton_4.setFont(font)
self.pushButton_4.setObjectName("pushButton_4")
self.retranslateUi(Dialog)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
_translate = QtCore.QCoreApplication.translate
Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
self.pushButton.setText(_translate("Dialog", "Upload"))
self.pushButton_2.setText(_translate("Dialog", "Validate"))
self.label.setText(_translate("Dialog", "Select Date"))
self.label_2.setText(_translate("Dialog", "Select Facility Name"))
self.pushButton_3.setText(_translate("Dialog", "Reset"))
self.pushButton_4.setText(_translate("Dialog", "Export"))
# Upload file button functionality
def loadFile(self):
global df
# getting file and its name
fileName, _ = QFileDialog.getOpenFileName(Dialog, "Open CSV",
(QtCore.QDir.homePath()), "CSV (*.csv)")
# displaying filename in display box
self.lineEdit.setText(fileName)
# reading csv files
df = pd.read_csv(fileName)
#grab the first row for the header
new_header = df.iloc[1]
#set the header row as the df header
df.columns = new_header
df.dropna(how='all', axis=1)
df.columns = ['col_' + str(ind) for ind in range(1, len(df.columns)+1)]
df.drop(df.index[[0, 1]], inplace=True)
self.model = PandasModel(df)
self.tableView.setModel(self.model)
self.proxy = CustomProxyModel(self)
self.proxy.setSourceModel(self.model)
#self.comboBox.activated[str].connect(self.onSelectIndependentCols)
#self.textEdit_2.activated[str].connect(self.onSelectIndependentCols)
# displaying list of dependent columns in a co
#self.comboBox.activated[str].connect(self.onSelectTargetCol)
self.comboBox.addItems(["{0}".format(col) for col in self.model._df['col_13'][:]])
self.comboBox_2.addItems(["{0}".format(col) for col in self.model._df['col_1'][:]])
# self.lineEdit_2.textChanged.connect(self.on_lineEdit_textChanged)
# self.horizontalHeader = self.tableView.horizontalHeader()
# self.horizontalHeader.sectionClicked.connect(
# self.on_view_horizontalHeader_sectionClicked
# )
self.pushButton.setDisabled(True)
return df
####################################################################################
@QtCore.pyqtSlot(int)
def on_view_horizontalHeader_sectionClicked(self, logicalIndex):
if logicalIndex == self.model.checkable_column:
return
self.menuValues = QtWidgets.QMenu(self)
self.comboBox.blockSignals(True)
self.comboBox.setCurrentIndex(
logicalIndex - 1
if logicalIndex > self.model.checkable_column
else logicalIndex
)
self.comboBox.blockSignals(True)
valuesUnique = set(
self.proxy.index(i, logicalIndex).data()
for i in range(self.proxy.rowCount())
)
actionAll = QtWidgets.QAction("All", self)
self.menuValues.addAction(actionAll)
self.menuValues.addSeparator()
for i, name in enumerate(valuesUnique):
action = QtWidgets.QAction(name, self)
action.setData(i)
self.menuValues.addAction(action)
headerPos = self.view.mapToGlobal(self.horizontalHeader.pos())
pos = headerPos + QtCore.QPoint(
self.horizontalHeader.sectionPosition(logicalIndex),
self.horizontalHeader.height(),
)
action = self.menuValues.exec_(pos)
if action is not None:
font = QtGui.QFont()
if action.data() is None: # all
self.proxy.setFilter("", logicalIndex)
else:
font.setBold(True)
self.proxy.setFilter(action.text(), logicalIndex)
self.model.setFont(logicalIndex - 1, font)
@QtCore.pyqtSlot(str)
def on_lineEdit_textChanged(self, text):
self.proxy.setFilter(text, self.comboBox.currentIndex() + 1)
####################################################################################
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
Dialog = QtWidgets.QDialog()
ui = Ui_Dialog()
ui.setupUi(Dialog)
Dialog.show()
sys.exit(app.exec_())
推荐答案
import pandas as pd
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QFileDialog
from PyQt5.QtCore import Qt
import sys
########################################### PandasModel to display it on tableView #####################
class PandasModel(QtCore.QAbstractTableModel):
def __init__(self, df=pd.DataFrame(), parent=None):
QtCore.QAbstractTableModel.__init__(self, parent=parent)
self._df = df.copy()
def toDataFrame(self):
return self._df.copy()
def headerData(self, section, orientation, role=QtCore.Qt.DisplayRole):
if role != QtCore.Qt.DisplayRole:
return QtCore.QVariant()
if orientation == QtCore.Qt.Horizontal:
try:
return self._df.columns.tolist()[section]
except (IndexError, ):
return QtCore.QVariant()
elif orientation == QtCore.Qt.Vertical:
try:
# return self.df.index.tolist()
return self._df.index.tolist()[section]
except (IndexError, ):
return QtCore.QVariant()
def data(self, index, role=QtCore.Qt.DisplayRole):
if role != QtCore.Qt.DisplayRole:
return QtCore.QVariant()
if not index.isValid():
return QtCore.QVariant()
return QtCore.QVariant(str(self._df.iloc[index.row(), index.column()]))
def setData(self, index, value, role):
row = self._df.index[index.row()]
col = self._df.columns[index.column()]
if hasattr(value, 'toPyObject'):
# PyQt4 gets a QVariant
value = value.toPyObject()
else:
# PySide gets an unicode
dtype = self._df[col].dtype
if dtype != object:
value = None if value == '' else dtype.type(value)
self._df.set_value(row, col, value)
return True
def rowCount(self, parent=QtCore.QModelIndex()):
return len(self._df.index)
def columnCount(self, parent=QtCore.QModelIndex()):
return len(self._df.columns)
def sort(self, column, order):
colname = self._df.columns.tolist()[column]
self.layoutAboutToBeChanged.emit()
self._df.sort_values(colname, ascending=order ==
QtCore.Qt.AscendingOrder, inplace=True)
self._df.reset_index(inplace=True, drop=True)
self.layoutChanged.emit()
################################################ Main UI ###############################################
class Ui_Dialog(object):
def setupUi(self, Dialog):
Dialog.setObjectName("Dialog")
Dialog.resize(1678, 977)
self.verticalLayoutWidget = QtWidgets.QWidget(Dialog)
self.verticalLayoutWidget.setGeometry(QtCore.QRect(10, 230, 201, 40))
self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")
self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)
self.verticalLayout.setContentsMargins(0, 0, 0, 0)
self.verticalLayout.setObjectName("verticalLayout")
# Upload Button Signal
self.pushButton = QtWidgets.QPushButton(self.verticalLayoutWidget)
self.pushButton.clicked.connect(self.upload)
font = QtGui.QFont()
font.setFamily("Waree")
font.setPointSize(12)
font.setBold(True)
font.setWeight(75)
self.pushButton.setFont(font)
self.pushButton.setObjectName("pushButton")
self.verticalLayout.addWidget(self.pushButton)
self.verticalLayoutWidget_2 = QtWidgets.QWidget(Dialog)
self.verticalLayoutWidget_2.setGeometry(QtCore.QRect(220, 20, 1441, 40))
self.verticalLayoutWidget_2.setObjectName("verticalLayoutWidget_2")
self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.verticalLayoutWidget_2)
self.verticalLayout_2.setContentsMargins(0, 0, 0, 0)
self.verticalLayout_2.setObjectName("verticalLayout_2")
self.lineEdit = QtWidgets.QLineEdit(self.verticalLayoutWidget_2)
font = QtGui.QFont()
font.setFamily("Waree")
font.setPointSize(12)
font.setBold(True)
font.setWeight(75)
self.lineEdit.setFont(font)
self.lineEdit.setObjectName("lineEdit")
self.verticalLayout_2.addWidget(self.lineEdit)
self.verticalLayoutWidget_3 = QtWidgets.QWidget(Dialog)
self.verticalLayoutWidget_3.setGeometry(QtCore.QRect(220, 60, 1441, 40))
self.verticalLayoutWidget_3.setObjectName("verticalLayoutWidget_3")
self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.verticalLayoutWidget_3)
self.verticalLayout_3.setContentsMargins(0, 0, 0, 0)
self.verticalLayout_3.setObjectName("verticalLayout_3")
self.lineEdit_2 = QtWidgets.QLineEdit(self.verticalLayoutWidget_3)
font = QtGui.QFont()
font.setFamily("Waree")
font.setPointSize(12)
font.setBold(True)
font.setWeight(75)
self.lineEdit_2.setFont(font)
self.lineEdit_2.setObjectName("lineEdit_2")
self.verticalLayout_3.addWidget(self.lineEdit_2)
self.gridLayoutWidget = QtWidgets.QWidget(Dialog)
self.gridLayoutWidget.setGeometry(QtCore.QRect(220, 100, 1441, 861))
self.gridLayoutWidget.setObjectName("gridLayoutWidget")
self.gridLayout = QtWidgets.QGridLayout(self.gridLayoutWidget)
self.gridLayout.setContentsMargins(0, 0, 0, 0)
self.gridLayout.setObjectName("gridLayout")
self.tableView = QtWidgets.QTableView(self.gridLayoutWidget)
font = QtGui.QFont()
font.setFamily("MS Shell Dlg 2")
font.setPointSize(10)
font.setBold(True)
font.setWeight(75)
self.tableView.setFont(font)
self.tableView.setObjectName("tableView")
self.gridLayout.addWidget(self.tableView, 0, 0, 1, 1)
self.verticalLayoutWidget_4 = QtWidgets.QWidget(Dialog)
self.verticalLayoutWidget_4.setGeometry(QtCore.QRect(10, 270, 201, 40))
self.verticalLayoutWidget_4.setObjectName("verticalLayoutWidget_4")
self.verticalLayout_4 = QtWidgets.QVBoxLayout(self.verticalLayoutWidget_4)
self.verticalLayout_4.setContentsMargins(0, 0, 0, 0)
self.verticalLayout_4.setObjectName("verticalLayout_4")
# Validate Button Signal
self.pushButton_2 = QtWidgets.QPushButton(self.verticalLayoutWidget_4)
self.pushButton_2.clicked.connect(self.validate)
font = QtGui.QFont()
font.setFamily("Waree")
font.setPointSize(12)
font.setBold(True)
font.setWeight(75)
self.pushButton_2.setFont(font)
self.pushButton_2.setObjectName("pushButton_2")
self.verticalLayout_4.addWidget(self.pushButton_2)
self.verticalLayoutWidget_5 = QtWidgets.QWidget(Dialog)
self.verticalLayoutWidget_5.setGeometry(QtCore.QRect(10, 710, 201, 41))
self.verticalLayoutWidget_5.setObjectName("verticalLayoutWidget_5")
self.verticalLayout_5 = QtWidgets.QVBoxLayout(self.verticalLayoutWidget_5)
self.verticalLayout_5.setContentsMargins(0, 0, 0, 0)
self.verticalLayout_5.setObjectName("verticalLayout_5")
# Export Button Signal
self.pushButton_3 = QtWidgets.QPushButton(self.verticalLayoutWidget_5)
self.pushButton_3.clicked.connect(self.exportCSV)
font = QtGui.QFont()
font.setFamily("Waree")
font.setPointSize(12)
font.setBold(True)
font.setWeight(75)
self.pushButton_3.setFont(font)
self.pushButton_3.setObjectName("pushButton_3")
self.verticalLayout_5.addWidget(self.pushButton_3)
self.verticalLayoutWidget_6 = QtWidgets.QWidget(Dialog)
self.verticalLayoutWidget_6.setGeometry(QtCore.QRect(10, 770, 201, 41))
self.verticalLayoutWidget_6.setObjectName("verticalLayoutWidget_6")
self.verticalLayout_6 = QtWidgets.QVBoxLayout(self.verticalLayoutWidget_6)
self.verticalLayout_6.setContentsMargins(0, 0, 0, 0)
self.verticalLayout_6.setObjectName("verticalLayout_6")
# Reset Button Signal
self.pushButton_4 = QtWidgets.QPushButton(self.verticalLayoutWidget_6)
font = QtGui.QFont()
font.setFamily("Waree")
font.setPointSize(12)
font.setBold(True)
font.setWeight(75)
self.pushButton_4.setFont(font)
self.pushButton_4.setObjectName("pushButton_4")
self.verticalLayout_6.addWidget(self.pushButton_4)
self.gridLayoutWidget_4 = QtWidgets.QWidget(Dialog)
self.gridLayoutWidget_4.setGeometry(QtCore.QRect(60, 20, 117, 144))
self.gridLayoutWidget_4.setObjectName("gridLayoutWidget_4")
self.gridLayout_2 = QtWidgets.QGridLayout(self.gridLayoutWidget_4)
self.gridLayout_2.setContentsMargins(0, 0, 0, 0)
self.gridLayout_2.setObjectName("gridLayout_2")
self.label_3 = QtWidgets.QLabel(self.gridLayoutWidget_4)
self.label_3.setText("")
self.label_3.setPixmap(QtGui.QPixmap("../../../../Pictures/74067_web (2).jpg"))
self.label_3.setObjectName("label_3")
self.gridLayout_2.addWidget(self.label_3, 0, 0, 1, 1)
# Select State Signal
self.pushButton_5 = QtWidgets.QPushButton(Dialog)
self.pushButton_5.clicked.connect(self.onSelectState)
self.pushButton_5.setGeometry(QtCore.QRect(10, 330, 201, 33))
font = QtGui.QFont()
font.setFamily("Waree")
font.setPointSize(12)
font.setBold(True)
font.setWeight(75)
self.pushButton_5.setFont(font)
self.pushButton_5.setObjectName("pushButton_5")
# Select District Signal
self.pushButton_6 = QtWidgets.QPushButton(Dialog)
self.pushButton_6.clicked.connect(self.onSelectDistrict)
self.pushButton_6.setGeometry(QtCore.QRect(10, 380, 201, 33))
font = QtGui.QFont()
font.setFamily("Waree")
font.setPointSize(12)
font.setBold(True)
font.setWeight(75)
self.pushButton_6.setFont(font)
self.pushButton_6.setObjectName("pushButton_6")
# Select Facility Type Signal
self.pushButton_7 = QtWidgets.QPushButton(Dialog)
self.pushButton_7.clicked.connect(self.onSelectFacilitytype)
self.pushButton_7.setGeometry(QtCore.QRect(0, 430, 211, 33))
font = QtGui.QFont()
font.setFamily("Waree")
font.setPointSize(12)
font.setBold(True)
font.setWeight(75)
self.pushButton_7.setFont(font)
self.pushButton_7.setObjectName("pushButton_7")
# Select Facility Name Signal
self.pushButton_8 = QtWidgets.QPushButton(Dialog)
self.pushButton_8.clicked.connect(self.onSelectFacilityName)
self.pushButton_8.setGeometry(QtCore.QRect(0, 480, 211, 33))
font = QtGui.QFont()
font.setFamily("Waree")
font.setPointSize(12)
font.setBold(True)
font.setWeight(75)
self.pushButton_8.setFont(font)
self.pushButton_8.setObjectName("pushButton_8")
#Select Month Signal
self.pushButton_9 = QtWidgets.QPushButton(Dialog)
self.pushButton_9.setGeometry(QtCore.QRect(0, 530, 211, 33))
font = QtGui.QFont()
font.setFamily("Waree")
font.setPointSize(12)
font.setBold(True)
font.setWeight(75)
self.pushButton_9.setFont(font)
self.pushButton_9.setObjectName("pushButton_9")
#Select Year Signal
self.pushButton_10 = QtWidgets.QPushButton(Dialog)
self.pushButton_10.setGeometry(QtCore.QRect(0, 580, 211, 33))
font = QtGui.QFont()
font.setFamily("Waree")
font.setPointSize(12)
font.setBold(True)
font.setWeight(75)
self.pushButton_10.setFont(font)
self.pushButton_10.setObjectName("pushButton_10")
self.retranslateUi(Dialog)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
_translate = QtCore.QCoreApplication.translate
Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
self.pushButton.setText(_translate("Dialog", "Upload"))
self.lineEdit_2.setPlaceholderText(_translate("Dialog", "Search..."))
self.pushButton_2.setText(_translate("Dialog", "Validate"))
self.pushButton_3.setText(_translate("Dialog", "Export"))
self.pushButton_4.setText(_translate("Dialog", "Reset"))
self.pushButton_5.setText(_translate("Dialog", "Select State"))
self.pushButton_6.setText(_translate("Dialog", "Select District"))
self.pushButton_7.setText(_translate("Dialog", "Select Facility Type"))
self.pushButton_8.setText(_translate("Dialog", "Select Facility Name"))
self.pushButton_9.setText(_translate("Dialog", "Select Month"))
self.pushButton_10.setText(_translate("Dialog", "Select Year"))
# To upload file
def upload(self):
global df_, df_OrgHeaders
products = {'Date': [2,3,1,5,3,9],
'Month': ['April', 'May', 'April', 'June', 'May', 'July'],
'Year': [2020, 2021, 2019, 2020, 2020, 2020],
'State': ['BR', 'JH', 'HR', 'JH', 'BR', 'PB'],
'Blank': ['nan','nan','nan','nan','nan','nan'],
'District' : ['BS', 'GW', 'AM', 'RN', 'PB', 'GR'],
'Facility Type': ['HSC', 'DH', 'HSC', 'CHC', 'HSC', 'DH'],
'Facility Name': ['PP CAC', 'SC Bkr', 'SC Bara', 'SC Bkr', 'PP CAC', 'PP CAC'],
'4.3': [1, 0, 2, 2, 9, 8],
'2.1.1.a': [0, 1, 1, 2, 3, 4],
'2.1.1.b': [1, 2, 0, 0, 0, 0],
'2.2': [1,2, 3, 4, 0, 0],
}
df_ = pd.DataFrame(products, columns= ['Date', 'Month', 'Year', 'State', 'Blank', 'District', 'Facility Type', 'Facility Name', '4.3', '2.1.1.a', '2.1.1.b', '2.2'])
self.tableView.setModel(PandasModel(df_))
# grab the first row for the header
new_header = df_.iloc[1]
# set the header row as the df header
df_.columns = new_header
#df_.dropna(how='all', axis=1)
df_.columns = ['col_' + str(index)
for index in range(1, len(df_.columns)+1)]
df_OrgHeaders = df_.iloc[[0, 1]]
#df_.drop(df_.index[[0, 1]], inplace=True)
#df_.dropna(subset=['col_4'], how='all', inplace=True)
return df_
def loadFile(self, df_):
self.pushButton.setDisabled(False)
return df_
# to validate modified checks
def validate(self):
global df, list_set
# df = self.loadFile()
df = self.loadFile(df_)
print("Entering Validate")
# 4.3 <= 2.1.1.a + 2.1.1.b + 2.2
def res1(df):
count = 0
if float(df['col_9']) > float(df['col_10']) + float(df['col_11']) + float(df['col_12']):
count = count+1
return 'Inconsistent'
elif pd.isnull(df['col_9']) and pd.isnull(df['col_10']) and pd.isnull(df['col_11']) and pd.isnull(df['col_12']):
return 'Blank'
elif pd.isnull(df['col_9']) or pd.isnull(df['col_10']) or pd.isnull(df['col_11']) or pd.isnull(df['col_12']):
return 'Blank Error'
else:
return 'Consistent'
df['4.3 <= 2.1.1.a + 2.1.1.b + 2.2'] = df.apply(res1, axis=1)
df = pd.concat([df_, df['4.3 <= 2.1.1.a + 2.1.1.b + 2.2']], axis=1)
df.astype(str)
# Select State #
# convert the set to the list
list_set = df_['col_4'].tolist()
unique_list = set(list_set)
return df
################################################################################
# Select State
# Select State Functionality
def onSelectState(self, index):
self.keywords = dict([(i, []) for i in range(df.shape[0])])
print(self.keywords)
self.menu = QtWidgets.QMenu(Dialog)
self.menu.setStyleSheet('QMenu { menu-scrollable: true; width: 400 }')
font = self.menu.font()
font.setPointSize(9)
font.setBold(True)
font.setWeight(75)
self.menu.setFont(font)
index = 4
self.col = index
data_unique = []
self.checkBoxs = []
# Selectall added into Dropdown
checkBox = QtWidgets.QCheckBox("Select all", self.menu)
# All the checkboxes are enabled to check
checkableAction = QtWidgets.QWidgetAction(self.menu)
checkableAction.setDefaultWidget(checkBox)
self.menu.addAction(checkableAction)
checkBox.setChecked(True)
checkBox.stateChanged.connect(self.slotSelect)
# list storing state data
item = list_set
# looping to fill checkboxes, initially all checkboxes will be checked
for i in range(len(df)):
if item[i] not in data_unique:
data_unique.append(item[i])
checkBox = QtWidgets.QCheckBox(item[i], self.menu)
checkBox.setChecked(True)
checkableAction = QtWidgets.QWidgetAction(self.menu)
checkableAction.setDefaultWidget(checkBox)
self.menu.addAction(checkableAction)
self.checkBoxs.append(checkBox)
# Ok, cancel button
btn = QtWidgets.QDialogButtonBox(QtWidgets.QDialogButtonBox.Ok | QtWidgets.QDialogButtonBox.Cancel,
QtCore.Qt.Horizontal, self.menu)
# ok selected
btn.accepted.connect(self.menuClose)
# rejected , nothing selected
btn.rejected.connect(self.menu.close)
checkableAction = QtWidgets.QWidgetAction(self.menu)
checkableAction.setDefaultWidget(btn)
self.menu.addAction(checkableAction)
self.pushButton_5.setMenu(self.menu)
# method to check -> uncheck and vice versa
def slotSelect(self, state):
for checkbox in self.checkBoxs:
checkbox.setChecked(QtCore.Qt.Checked == state)
# after ok selected
def menuClose(self):
self.keywords[self.col] = []
for element in self.checkBoxs:
if element.isChecked():
self.keywords[self.col].append(element.text())
self.filterdata()
self.menu.close()
# Filter data columnwise
def filterdata(self):
global final_df
#keywords = dict([(i, []) for i in range(self.filterall.columnCount())])
columnsShow = dict([(i, True) for i in range(df.shape[0])])
# for i in range(df.shape[0]):
j=0
for j in range(df.shape[0]):
item = list_set
print(self.keywords[self.col])
#if self.keywords[self.col]:
if item[j] not in self.keywords[self.col]:
columnsShow[j] = False
# for key, value in columnsShow.items():
final_lst = [i for i in columnsShow.values()]
print(final_lst, 'this is final list of Select State')
final_df = df[final_lst]
print(final_df)
self.tableView.setModel(PandasModel(final_df))
return final_df
################################################################################
# Select District
# Select District Functionality
def onSelectDistrict(self, index):
self.keywords = dict([(i, []) for i in range(final_df.shape[0])])
print(self.keywords)
self.menu = QtWidgets.QMenu(Dialog)
self.menu.setStyleSheet('QMenu { menu-scrollable: true; width: 400 }')
font = self.menu.font()
font.setPointSize(9)
font.setBold(True)
font.setWeight(75)
self.menu.setFont(font)
index = 6
self.col = index
data_unique = []
self.checkBoxs = []
# Selectall added into Dropdown
checkBox = QtWidgets.QCheckBox("Select all", self.menu)
# All the checkboxes are enabled to check
checkableAction = QtWidgets.QWidgetAction(self.menu)
checkableAction.setDefaultWidget(checkBox)
self.menu.addAction(checkableAction)
checkBox.setChecked(True)
checkBox.stateChanged.connect(self.slotSelectDistrict)
# list storing state data
list_set = final_df['col_6'].to_list()
item = list_set
# looping to fill checkboxes, initially all checkboxes will be checked
for i in range(len(item)):
if item[i] not in data_unique:
data_unique.append(item[i])
checkBox = QtWidgets.QCheckBox(item[i], self.menu)
checkBox.setChecked(True)
checkableAction = QtWidgets.QWidgetAction(self.menu)
checkableAction.setDefaultWidget(checkBox)
self.menu.addAction(checkableAction)
self.checkBoxs.append(checkBox)
# Ok, cancel button
btn = QtWidgets.QDialogButtonBox(QtWidgets.QDialogButtonBox.Ok | QtWidgets.QDialogButtonBox.Cancel,
QtCore.Qt.Horizontal, self.menu)
# ok selected
btn.accepted.connect(self.menuCloseDistrict)
# rejected , nothing selected
btn.rejected.connect(self.menu.close)
checkableAction = QtWidgets.QWidgetAction(self.menu)
checkableAction.setDefaultWidget(btn)
self.menu.addAction(checkableAction)
self.pushButton_6.setMenu(self.menu)
# method to check -> uncheck and vice versa
def slotSelectDistrict(self, state):
for checkbox in self.checkBoxs:
checkbox.setChecked(QtCore.Qt.Checked == state)
# after ok selected
def menuCloseDistrict(self):
self.keywords[self.col] = []
for element in self.checkBoxs:
if element.isChecked():
self.keywords[self.col].append(element.text())
print(self.keywords[self.col])
self.filterdataDistrict()
self.menu.close()
# Filter data columnwise
def filterdataDistrict(self):
global final_df_District
#keywords = dict([(i, []) for i in range(self.filterall.columnCount())])
columnsShow = dict([(i, True) for i in range(final_df['col_6'].shape[0])])
print(columnsShow)
j=0
for j in range(final_df['col_6'].shape[0]):
item = final_df['col_6'].to_list()
#if self.keywords[self.col]:
if item[j] not in self.keywords[self.col]:
columnsShow[j] = False
# for key, value in columnsShow.items():
final_lst = [i for i in columnsShow.values()]
print(final_lst, 'this is final list of Select District')
final_df_District = final_df[final_lst]
print(final_df_District)
self.tableView.setModel(PandasModel(final_df_District))
return final_df_District
################################# Main Function ##################################
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
Dialog = QtWidgets.QDialog()
ui = Ui_Dialog()
ui.setupUi(Dialog)
Dialog.show()
sys.exit(app.exec_())
这篇关于想根据组合框和搜索栏过滤行我也想用选择取消全选和在pyQt5中搜索使复选框多选的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!