PyQt-Fluent-Widgets icon indicating copy to clipboard operation
PyQt-Fluent-Widgets copied to clipboard

[Bug]: 点击ComboBox闪退问题

Open Win12Home opened this issue 10 months ago • 3 comments

What happened?

我在子窗口上使用了ComboBox,点击它就会闪退并发生如下错误

Operation System

Windows11 23H2

Python Version

3.12.2 64bit

PyQt/PySide Version

PyQt5 5.15.10

PyQt/PySide-Fluent-Widgets Version

1.5.4

How to Reproduce?

报错

Traceback (most recent call last):
  File "C:\Program Files\Python312\Lib\site-packages\qfluentwidgets\components\widgets\combo_box.py", line 394, in mouseReleaseEvent
    self._toggleComboMenu()
  File "C:\Program Files\Python312\Lib\site-packages\qfluentwidgets\components\widgets\combo_box.py", line 350, in _toggleComboMenu
    self._showComboMenu()
  File "C:\Program Files\Python312\Lib\site-packages\qfluentwidgets\components\widgets\combo_box.py", line 340, in _showComboMenu
    menu.view.adjustSize(pd, MenuAnimationType.DROP_DOWN)
  File "C:\Program Files\Python312\Lib\site-packages\qfluentwidgets\components\widgets\menu.py", line 204, in adjustSize
    for i in range(self.count()):
                   ^^^^^^^^^^^^
RuntimeError: wrapped C/C++ object of type MenuActionListWidget has been deleted

Minimum code

class ComboboxSettingCard(SettingCard):
    def __init__(self,icon,title,content,parent):
        super().__init__(icon,title,content,parent)
        self.combobox=ComboBox(self)

    def resizeEvent(self, a0):
        super().resizeEvent(a0)
        self.combobox.setGeometry(self.width()-300,20,280,30)

class SettingsDialog(FluentWindowBase):
    def __init__(self,p):
        super().__init__()
        self.settings=[]
        self.setTitleBar(FluentTitleBar(self))
        self.resize(900,750)
        self.setMaximumSize(900,750)
        self.setMinimumSize(900,750)
        self.titleBar.setDoubleClickEnabled(False)
        self.titleBar.minBtn.hide()
        self.titleBar.maxBtn.hide()
        self.setWindowIcon(QIcon(FluentIcon.SETTING.path()))
        self.setWindowTitle(setlanguage["title"])
        self.listwidget=ListWidget(self)
        self.listwidget.itemClicked.connect(self.itemClicked)
        self.appearance=SettingCardGroup(setlanguage["appearance"])
        self.setlanguage=ComboboxSettingCard(FluentIcon.LANGUAGE,setlanguage["languageset"],setlanguage["languagesetsub"],self.appearance)
        self.setLanguages()
        self.setlanguage.combobox.currentIndexChanged.connect(self.applyLanguage)
        self.appearance.addSettingCards([self.setlanguage])
        self.addSetting(setlanguage["appearance"],self.appearance)

    def tipsRestart(self):
        self.msg=MessageBox(language["tips"],language["changelanguagecontext"],self)
        self.msg.yesButton.setText(language["done"])
        self.msg.cancelButton.hide()
        self.msg.buttonLayout.insertStretch(1)
        self.msg.exec_()

    def applyLanguage(self):
        row=self.setlanguage.combobox.currentIndex()
        settings.apply("language",str(languagelist[row][0].stem))
        self.tipsRestart()

    def setLanguages(self):
        row=0
        for i in languagelist:
            self.setlanguage.combobox.addItem(i[1])
            if languageoriginal["name"] == i[1]:self.setlanguage.combobox.setCurrentIndex(row)
            row+=1

    def addSetting(self,name:str,interface:QWidget):
        self.stackedWidget.addWidget(interface)
        self.settings.append([interface,QListWidgetItem(name,self.listwidget)])
        self.listwidget.setCurrentRow(0)

    def itemClicked(self):
        item=self.listwidget.currentRow()
        interface=self.settings[item][0]
        self.stackedWidget.setCurrentWidget(interface)

    def resizeEvent(self, e):
        super().resizeEvent(e)
        self.listwidget.setGeometry(0,self.titleBar.height(),300,self.height()-self.titleBar.height())
        self.stackedWidget.setGeometry(300,self.titleBar.height(),600,self.height()-self.titleBar.height())

Win12Home avatar Apr 10 '24 13:04 Win12Home

还会有这样的问题 `Traceback (most recent call last):

File "C:\Program Files\Python312\Lib\site-packages\qfluentwidgets\components\widgets\combo_box.py", line 394, in mouseReleaseEvent self._toggleComboMenu()

File "C:\Program Files\Python312\Lib\site-packages\qfluentwidgets\components\widgets\combo_box.py", line 350, in _toggleComboMenu self._showComboMenu()

File "C:\Program Files\Python312\Lib\site-packages\qfluentwidgets\components\widgets\combo_box.py", line 341, in _showComboMenu menu.exec(pd, aniType=MenuAnimationType.DROP_DOWN)

File "C:\Program Files\Python312\Lib\site-packages\qfluentwidgets\components\widgets\combo_box.py", line 510, in exec return super().exec(pos, ani, aniType) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

File "C:\Program Files\Python312\Lib\site-packages\qfluentwidgets\components\widgets\menu.py", line 726, in exec self.aniManager.exec(pos)

File "C:\Program Files\Python312\Lib\site-packages\qfluentwidgets\components\widgets\menu.py", line 856, in exec self.ani.start()

RuntimeError: wrapped C/C++ object of type QPropertyAnimation has been deleted`

Win12Home avatar Apr 11 '24 10:04 Win12Home

给个直接能跑的代码

rainzee avatar Apr 13 '24 07:04 rainzee

没有办法复现 请给出完整的代码 测试代码如下:

from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from qfluentwidgets import *
from qfluentwidgets.window.fluent_window import FluentWindowBase


languagelist = [f"{i}" for i in range(100)]


class ComboboxSettingCard(SettingCard):
    def __init__(self, icon, title, content, parent):
        super().__init__(icon, title, content, parent)
        self.combobox = ComboBox(self)

    def resizeEvent(self, a0):
        super().resizeEvent(a0)
        self.combobox.setGeometry(self.width()-300, 20, 280, 30)


class SettingsDialog(FluentWindowBase):
    def __init__(self, p=None):
        super().__init__()
        self.settings = []
        self.setTitleBar(FluentTitleBar(self))
        self.resize(900, 750)
        self.appearance = SettingCardGroup("title")
        self.listwidget = ListWidget(self)
        self.listwidget.itemClicked.connect(self.itemClicked)
        self.setlanguage = ComboboxSettingCard(
            FluentIcon.LANGUAGE, "test", "text", self.appearance)
        self.setlanguage.combobox.currentIndexChanged.connect(
            self.applyLanguage)
        self.appearance.addSettingCards([self.setlanguage])
        self.appearance.move(10, self.titleBar.height())
        self.appearance.resize(
            self.width() - 20, self.height() - self.titleBar.height())
        self.setLanguages()
        self.addSetting("test", self.appearance)

    def applyLanguage(self):
        pass

    def setLanguages(self):
        row = 0
        for i in languagelist:
            self.setlanguage.combobox.addItem(i)
            self.setlanguage.combobox.setCurrentIndex(0)

    def addSetting(self, name: str, interface: QWidget):
        self.stackedWidget.addWidget(interface)
        self.settings.append(
            [interface, QListWidgetItem(name, self.listwidget)])
        self.listwidget.setCurrentRow(0)

    def resizeEvent(self, e):
        super().resizeEvent(e)
        self.listwidget.setGeometry(
            0, self.titleBar.height(), 300, self.height()-self.titleBar.height())
        self.stackedWidget.setGeometry(
            300, self.titleBar.height(), 600, self.height()-self.titleBar.height())

    def itemClicked(self):
        item = self.listwidget.currentRow()
        interface = self.settings[item][0]
        self.stackedWidget.setCurrentWidget(interface)


app = QApplication([])
dlg = SettingsDialog()
dlg.show()
app.exec()

AlexZhu2001 avatar Apr 14 '24 12:04 AlexZhu2001