1.实现了文件拖入自动读取功能,主要思路是给窗口类或者自定义类添加一个事件过滤器,并且在发生拖入事件时实现相关逻辑。
- def eventFilter(self, obj, event):
- """
- 处理窗体内出现的事件,如果有需要则自行添加if判断语句;
- 目前已经实现将拖到控件上文件的路径设置为控件的显示文本;
- """
- if event.type() == QtCore.QEvent.DragEnter:
- event.accept()
- if event.type() == QtCore.QEvent.Drop:
- print("enter")
- md = event.mimeData()
-
- if md.hasUrls():
- # 此处md.urls()的返回值为拖入文件的file路径列表,即支持多文件同时拖入;
- # 此处默认读取第一个文件的路径进行处理,可按照个人需求进行相应的修改
- url = md.urls()[0]
- self.f_list = []
- for url in md.urls():
- self.f_list.append(url.toLocalFile())
- obj.setText(",".join(self.f_list))
- self.load_data()
- return True
- return super().eventFilter(obj, event)
相应的控件添加如下代码
- self.h1_text.setAcceptDrops(True)
- self.h1_text.installEventFilter(self)
这两句代码意思是首先设置控件可以接收drop事件,然后指定事件过滤器的实例。
2.把下拉列表改成可搜索模式,用了一个网上写好的扩展类,代码如下
- class ExtendedComboBox(QComboBox):
- def __init__(self, parent=None):
- super(ExtendedComboBox, self).__init__(parent)
-
- self.setFocusPolicy(Qt.StrongFocus)
- self.setEditable(True)
-
- # add a filter model to filter matching items
- self.pFilterModel = QSortFilterProxyModel(self)
- self.pFilterModel.setFilterCaseSensitivity(Qt.CaseInsensitive)
- self.pFilterModel.setSourceModel(self.model())
-
- # add a completer, which uses the filter model
- self.completer = QCompleter(self.pFilterModel, self)
- # always show all (filtered) completions
- self.completer.setCompletionMode(QCompleter.UnfilteredPopupCompletion)
- self.setCompleter(self.completer)
-
- # connect signals
- self.lineEdit().textEdited.connect(self.pFilterModel.setFilterFixedString)
- self.completer.activated.connect(self.on_completer_activated)
-
- # on selection of an item from the completer, select the corresponding item from combobox
- def on_completer_activated(self, text):
- if text:
- index = self.findText(text)
- self.setCurrentIndex(index)
- self.activated[str].emit(self.itemText(index))
-
- # on model change, update the models of the filter and completer as well
- def setModel(self, model):
- super(ExtendedComboBox, self).setModel(model)
- self.pFilterModel.setSourceModel(model)
- self.completer.setModel(self.pFilterModel)
-
- # on model column change, update the model column of the filter and completer as well
- def setModelColumn(self, column):
- self.completer.setCompletionColumn(column)
- self.pFilterModel.setFilterKeyColumn(column)
- super(ExtendedComboBox, self).setModelColumn(column)
原来我写的代码不用做任何改变,直接把类名改下就行,可以说很方便了。
3.添加了进度条。今天终于时把进度条弄明白了,可能我之前进度计算错了,导致一直是0,今天本来没想做进度条,而是做大文件读取时界面卡死问题,网上说是单独开个线程,这个之前也知道了,但是数据不知道怎么获取,今天试了下,跟普通信号没什么区别,建个dataframe的信号就行了,读完直接向主窗口发信号就行了,主窗口新写个接收信号的函数就行了。