PyQt-Fluent-Widgets
PyQt-Fluent-Widgets copied to clipboard
[Bug]: 点击ComboBox闪退问题
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())
还会有这样的问题 `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`
给个直接能跑的代码
没有办法复现 请给出完整的代码 测试代码如下:
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()