内部C++对象已经删除了PySID2中的错误

2024-09-29 21:40:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在Pyside2中的QTreeWidget内创建一个列表(如QComboBox)。每当我在单元格内单击以调用此列表时,它都会抛出错误

Traceback (most recent call last):
  File "customQT.py", line 1489, in event
    self.popup.move(Globpos)
RuntimeError: Internal C++ object (PySide2.QtWidgets.QListView) already deleted.

“trial\u justifier\u gui”是gui的.py文件的名称

from PySide2.QtWidgets import QWidget
from trial_justifier_gui import Ui_MainWindow
import os
import sys
from sys import argv
from os import path,listdir,remove,startfile,mkdir
from customQT import  MyLineXML,MyComboXML,MyMeasureXML
from PySide2.QtCore import *
from Mylogger import *
from shutil import copy2
import xml.etree.ElementTree as ET
from xml.etree.ElementTree import SubElement, Element
from PySide2 import QtCore, QtGui, QtWidgets
from PySide2.QtWidgets import *
from PySide2.QtCore import *
from PySide2.QtGui import *




class justifier(QtWidgets.QMainWindow):

    def __init__(self,PathProject):
        #super(justifier, self).__init__()
        listbaseline = ['']
        
        QtWidgets.QMainWindow.__init__(self, parent=None)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.ui.btnCreateBaselineNew.clicked.connect(self.analysispath)


    def analysispath(self):

        self.ReqTree = QtWidgets.QTreeWidget(self.ui.tab_2)
        self.ReqTree.clear()    
        self.ReqTree.setColumnCount(6)
        self.ReqTree.setHeaderLabels(["File", "Line", "Item", "Message","Justification ","Status"])
        
        self.ReqTree.header().setDefaultAlignment(Qt.AlignVCenter)
  
        self.ReqTree.setWordWrap(True)

        Line2 = MyComboXML(statusElem,["NEW","OK","KO","DELETED"],True)
        Line2.modified.connect(self.modif)

        self.ReqTree.setItemWidget(childBisPN,1,Line2)

用于创建列表和填充状态的MyComboXML类是:

调用此类的代码段是:

class MyComboXML(QLineEdit):

        modified = Signal()

        def __init__(self,elem,text,editable):
            QLineEdit.__init__(self)
            self.liste = text
            self.filter = ""
            self.elem = elem
            self.editable = editable

            self.listPopup = None
            self.listTooltip = None
            self.setText(elem.text)
            self.setMouseTracking(True)
            self.createModel()

            # connect signals
            self.textEdited.connect(self.pFilterModel.setFilterFixedString)
            self.textChanged.connect(self.modifyText)

            # self.completer.activated.connect(self.on_completer_activated)    
            self.isVisible = False
            if not self.editable :
                self.readOnly()

        def createModel(self):

            self.model = QStandardItemModel()
            self.model.setRowCount(len(self.liste))
            self.model.setColumnCount(1)
            row = 0
            for item in self.liste:
                itemModel = QStandardItem()
                # itemModel.setToolTip(item)
                itemModel.setText(item)
                self.model.setItem(row, 0, itemModel)
                row = row + 1
            # self.popup.setModel(self.model)

            self.pFilterModel = QSortFilterProxyModel(self.model)
            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.popup =self.completer.popup()
            self.setCompleter(self.completer)
            
        def event(self,e):
            #print(e.type())
            if (e.type() == QEvent.MouseButtonPress):
                if self.editable:
                    #popup =self.completer.popup()
                    Globpos = self.parent().mapToGlobal(self.pos())
                    Globpos.setY(Globpos.y()+self.height()-2)
                    **self.popup.move(Globpos)**

                    if self.isVisible:
                        self.popup.hide()
                        self.isVisible = False
                    else:
                        self.popup.show()
                        self.isVisible = True

            return QLineEdit.event(self,e)

我通过以下方式运行justifier类:

if __name__ == '__main__':
    app=0
    app = QtWidgets.QApplication(sys.argv)
    mainWin = justifier(current_directory)
    app.processEvents()
    try:
        sys.exit(app.exec_())
    except:
        print("Exiting")

GUI文件的代码如下所示:

from PySide2.QtCore import (QCoreApplication, QDate, QDateTime, QMetaObject,
    QObject, QPoint, QRect, QSize, QTime, QUrl, Qt)
from PySide2.QtGui import (QBrush, QColor, QConicalGradient, QCursor, QFont,
    QFontDatabase, QIcon, QKeySequence, QLinearGradient, QPalette, QPainter,
    QPixmap, QRadialGradient)
from PySide2 import QtCore, QtGui, QtWidgets
from PySide2.QtWidgets import *
from PySide2.QtCore import *
from PySide2.QtGui import *


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        if not MainWindow.objectName():
            MainWindow.setObjectName(u"MainWindow")
        MainWindow.resize(1200, 700)
        MainWindow.setMinimumSize(QSize(1200, 700))
        MainWindow.setFocusPolicy(Qt.StrongFocus)
        MainWindow.setStyleSheet(u"background-color: rgb(230, 242, 255);")
        self.centralwidget = QWidget(MainWindow)
        self.centralwidget.setObjectName(u"centralwidget")

        self.verticalLayoutWidget = QWidget(self.centralwidget)
        self.verticalLayoutWidget.setObjectName(u"verticalLayoutWidget")
        self.verticalLayoutWidget.setGeometry(QRect(110, 300, 1000, 400))
        self.verticalLayout = QVBoxLayout(self.verticalLayoutWidget)
        self.verticalLayout.setObjectName(u"verticalLayout")
        self.verticalLayout.setContentsMargins(0, 0, 0, 0)
        self.tabWidget = QTabWidget(self.verticalLayoutWidget)
        self.tabWidget.setObjectName(u"tabWidget")
        self.tab = QWidget()
        self.tab.setObjectName(u"tab")
        self.tabWidget.addTab(self.tab, "")
        self.tab_2 = QWidget()
        self.tab_2.setObjectName(u"tab_2")
        self.tabWidget.addTab(self.tab_2, "")

        self.verticalLayout.addWidget(self.tabWidget)

        MainWindow.setCentralWidget(self.centralwidget)

每当弹出窗口的代码被调用时,我就会得到错误,应用程序就会退出。这是我能提供的最小可重复性示例,因为我在代码中只包含了必要的模块


Tags: fromimportselfmodeldeftabpopuppyside2

热门问题