zhiyiYo / PyQt-Fluent-Widgets

A fluent design widgets library based on C++ Qt/PyQt/PySide. Make Qt Great Again.
https://qfluentwidgets.com
GNU General Public License v3.0
5.8k stars 562 forks source link

[Bug]: ComboBox多次点击后程序卡死 #965

Closed WEIFENG2333 closed 2 months ago

WEIFENG2333 commented 2 months ago

What happened?

问题描述: 在使用 qfluentwidgets 中的 ComboBox 控件时,展开下拉菜单后,再次点击相同的地方会导致应用程序卡死无响应。 image

版本信息:

预期结果: 点击 ComboBox 后应展开下拉菜单,第二次点击时应关闭下拉菜单,程序应保持正常响应。 实际结果为ComboBox 展开后,再次点击相同位置,应用程序卡住,无响应。

修复建议: 通过查看原方法发现好像是_onDropMenuClosed是出现问题,虽然不明白为什么要加一个这个判断, 但是经过修改直接self.dropMenu = None,问题得到解决。(注释部分为原有的代码)

def _onDropMenuClosed(self):
    self.dropMenu = None
    # if sys.platform != "win32":
    #     self.dropMenu = None
    # else:
    #     pos = self.mapFromGlobal(QCursor.pos())
    #     if not self.rect().contains(pos):
    #         self.dropMenu = None

请尽快确认并修复此问题,谢谢!

Minimum code

复现步骤:

  1. 使用以下代码创建一个简单的 ComboBox 示例(详细代码见下方)。
  2. 启动应用程序,点击 ComboBox 展开菜单。
  3. 再次点击同一个位置,预期下拉菜单应该关闭,但程序会卡住。
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout
from qfluentwidgets import ComboBox
from PyQt5.QtCore import Qt

class ComboBoxExample(QWidget):
    def __init__(self):
        super().__init__()
        self.init_ui()

    def init_ui(self):
        layout = QVBoxLayout(self)
        # 创建一个 ComboBox 并添加选项
        self.combo_box = ComboBox(self)
        self.combo_box.addItems(['1', '2', '3', '4'])
        # 将 ComboBox 添加到布局中
        layout.addWidget(self.combo_box)
        # 设置窗口的基本属性
        self.setWindowTitle('ComboBox 示例')
        self.resize(400, 300)

QApplication.setAttribute(Qt.AA_EnableHighDpiScaling)
QApplication.setAttribute(Qt.AA_UseHighDpiPixmaps)

# 启动应用程序
app = QApplication(sys.argv)
# 创建并显示窗口
window = ComboBoxExample()
window.show()

# 运行应用程序事件循环
sys.exit(app.exec_())
zhiyiYo commented 2 months ago

可能是我上个版本修内存泄露导致的

zhiyiYo commented 2 months ago

1.6.5 已修复此问题