• 2022-08-06


    1.实现了文件拖入自动读取功能,主要思路是给窗口类或者自定义类添加一个事件过滤器,并且在发生拖入事件时实现相关逻辑。

    1. def eventFilter(self, obj, event):
    2. """
    3. 处理窗体内出现的事件,如果有需要则自行添加if判断语句;
    4. 目前已经实现将拖到控件上文件的路径设置为控件的显示文本;
    5. """
    6. if event.type() == QtCore.QEvent.DragEnter:
    7. event.accept()
    8. if event.type() == QtCore.QEvent.Drop:
    9. print("enter")
    10. md = event.mimeData()
    11. if md.hasUrls():
    12. # 此处md.urls()的返回值为拖入文件的file路径列表,即支持多文件同时拖入;
    13. # 此处默认读取第一个文件的路径进行处理,可按照个人需求进行相应的修改
    14. url = md.urls()[0]
    15. self.f_list = []
    16. for url in md.urls():
    17. self.f_list.append(url.toLocalFile())
    18. obj.setText(",".join(self.f_list))
    19. self.load_data()
    20. return True
    21. return super().eventFilter(obj, event)

    相应的控件添加如下代码

    1. self.h1_text.setAcceptDrops(True)
    2. self.h1_text.installEventFilter(self)

    这两句代码意思是首先设置控件可以接收drop事件,然后指定事件过滤器的实例。

    2.把下拉列表改成可搜索模式,用了一个网上写好的扩展类,代码如下

    1. class ExtendedComboBox(QComboBox):
    2. def __init__(self, parent=None):
    3. super(ExtendedComboBox, self).__init__(parent)
    4. self.setFocusPolicy(Qt.StrongFocus)
    5. self.setEditable(True)
    6. # add a filter model to filter matching items
    7. self.pFilterModel = QSortFilterProxyModel(self)
    8. self.pFilterModel.setFilterCaseSensitivity(Qt.CaseInsensitive)
    9. self.pFilterModel.setSourceModel(self.model())
    10. # add a completer, which uses the filter model
    11. self.completer = QCompleter(self.pFilterModel, self)
    12. # always show all (filtered) completions
    13. self.completer.setCompletionMode(QCompleter.UnfilteredPopupCompletion)
    14. self.setCompleter(self.completer)
    15. # connect signals
    16. self.lineEdit().textEdited.connect(self.pFilterModel.setFilterFixedString)
    17. self.completer.activated.connect(self.on_completer_activated)
    18. # on selection of an item from the completer, select the corresponding item from combobox
    19. def on_completer_activated(self, text):
    20. if text:
    21. index = self.findText(text)
    22. self.setCurrentIndex(index)
    23. self.activated[str].emit(self.itemText(index))
    24. # on model change, update the models of the filter and completer as well
    25. def setModel(self, model):
    26. super(ExtendedComboBox, self).setModel(model)
    27. self.pFilterModel.setSourceModel(model)
    28. self.completer.setModel(self.pFilterModel)
    29. # on model column change, update the model column of the filter and completer as well
    30. def setModelColumn(self, column):
    31. self.completer.setCompletionColumn(column)
    32. self.pFilterModel.setFilterKeyColumn(column)
    33. super(ExtendedComboBox, self).setModelColumn(column)

    原来我写的代码不用做任何改变,直接把类名改下就行,可以说很方便了。

    3.添加了进度条。今天终于时把进度条弄明白了,可能我之前进度计算错了,导致一直是0,今天本来没想做进度条,而是做大文件读取时界面卡死问题,网上说是单独开个线程,这个之前也知道了,但是数据不知道怎么获取,今天试了下,跟普通信号没什么区别,建个dataframe的信号就行了,读完直接向主窗口发信号就行了,主窗口新写个接收信号的函数就行了。

  • 相关阅读:
    Android FileProvider笔记
    软件库V1.2版本开源-首页UI优化
    架构师日记-从数据库发展历程到数据结构设计探析
    Security开启csrf防护后没有办法获取_csrfToken
    函数栈帧的创建和销毁
    面试官:今天要不来聊聊Redis基础吧?
    HarmonyOS分布式协同演奏技术实现路线(Java)
    常用排序算法总结对比
    【C# 窗体 超市购物买单系统】简单版和进阶版
    正则表达式(JAVA)
  • 原文地址:https://blog.csdn.net/zy1620454507/article/details/126191242