Hi Marcus,
Thanks for your feedback. I decided to create a separate class for the
widget that are used in the tab widget, and when that widget is deleted run
a function to cleanup the model. Not sure if this is the "proper" way to do
it. I have not yet tried the pymotw to inspect the gc, will look into that.
BR,
Johan
import sys
from PySide2 import QtGui, QtCore, QtWidgets
from maya import OpenMayaUI as omui
from shiboken2 import wrapInstance
from functools import partial
class ListWidget(QtWidgets.QWidget):
def __init__(self, parent=None):
super(ListWidget, self).__init__(parent)
vbox = QtWidgets.QVBoxLayout(self)
self.model = QtGui.QStandardItemModel()
self.list_view = QtWidgets.QListView()
self.list_view.setModel(self.model)
vbox.addWidget(self.list_view)
self.destroyed.connect(partial(ListWidget._on_destroyed,
self.model))
def populate_list(self, name_list):
for name in name_list:
self.model.appendRow(QtGui.QStandardItem(name))
@staticmethod
def _on_destroyed(model):
#print model
model.deleteLater()
class TabWidget(QtWidgets.QWidget):
def __init__(self, parent=None):
super(TabWidget, self).__init__(parent)
self.setWindowFlags(QtCore.Qt.Tool)
self.setGeometry(50, 200, 300, 300)
self.setWindowTitle('Tabwidget')
vbox = QtWidgets.QVBoxLayout(self)
self.tab_widget = QtWidgets.QTabWidget()
vbox.addWidget(self.tab_widget)
label_list = ['A', 'B', 'C']
# add tabs
add_tabs_button = QtWidgets.QPushButton('Add Tabs')
add_tabs_button.clicked.connect(partial(self.add_tabs, label_list))
vbox.addWidget(add_tabs_button)
# remove tabs
remove_tabs_button = QtWidgets.QPushButton('Remove Tabs')
remove_tabs_button.clicked.connect(self.remove_tabs)
vbox.addWidget(remove_tabs_button)
def remove_tabs(self):
for i in range(self.tab_widget.count()):
self.tab_widget.widget(i).deleteLater()
def add_tabs(self, label_list):
for label in label_list:
list_widget = ListWidget()
list_widget.populate_list([ '{} {}'.format(label, n) for n in
range(5)])
self.tab_widget.addTab(list_widget, label)
def show():
mayaMainWindow = wrapInstance(long(omui.MQtUtil.mainWindow()),
QtWidgets.QWidget)
win = TabWidget(parent=mayaMainWindow)
win.show()
return win
On Sunday, October 9, 2016 at 2:42:33 PM UTC+2, johan Borgström wrote:
>
> Hi,
>
> I am using a tabwidget and on each tab I am creating a listview with a
> standard model. My question is how do I make sure when I delete the tabs
> that everything gets deleted, including the model. As far as I understand
> if you delete the parent widget the children will also be deleted.
>
> Below you will find a simplified version of what I am creating. Should I
> "manually" deleting the model?
>
> Thankful for all comments and feedback!
>
> BR,
> Johan
>
> import sys
> from PySide2 import QtGui, QtCore, QtWidgets
> from maya import OpenMayaUI as omui
> from shiboken2 import wrapInstance
> from functools import partial
>
>
> class TabWidget(QtWidgets.QWidget):
>
> def __init__(self, parent=None):
> super(TabWidget, self).__init__(parent)
>
> self.setWindowFlags(QtCore.Qt.Tool)
> self.setGeometry(50, 200, 300, 300)
> self.setWindowTitle('Tabwidget')
>
> vbox = QtWidgets.QVBoxLayout(self)
>
> self.tab_widget = QtWidgets.QTabWidget()
> vbox.addWidget(self.tab_widget)
>
> label_list = ['A', 'B', 'C']
>
> # add tabs
> add_tabs_button = QtWidgets.QPushButton('Add Tabs')
> add_tabs_button.clicked.connect(partial(self.add_tabs, label_list))
> vbox.addWidget(add_tabs_button)
>
> # remove tabs
> remove_tabs_button = QtWidgets.QPushButton('Remove Tabs')
> remove_tabs_button.clicked.connect(self.remove_tabs)
> vbox.addWidget(remove_tabs_button)
>
> def remove_tabs(self):
> #self.tab_widget.clear()
> for i in range(self.tab_widget.count()):
> #print self.tab_widget.removeTab(0)
> self.tab_widget.widget(i).deleteLater()
>
> def add_tabs(self, label_list):
>
> for label in label_list:
>
> widget = QtWidgets.QWidget()
> self.tab_widget.addTab(widget, label)
> vbox = QtWidgets.QVBoxLayout(widget)
>
> model = QtGui.QStandardItemModel()
>
> for i in range(5):
> model.appendRow(QtGui.QStandardItem('{} {}'.format(label,
> i)))
>
> list_view = QtWidgets.QListView()
> list_view.setModel(model)
> vbox.addWidget(list_view)
>
>
> def show():
> mayaMainWindow = wrapInstance(long(omui.MQtUtil.mainWindow()),
> QtWidgets.QWidget)
> win = TabWidget(parent=mayaMainWindow)
> win.show()
> return win
>
>
>
--
You received this message because you are subscribed to the Google Groups
"Python Programming for Autodesk Maya" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/python_inside_maya/3ede9fb4-db38-4b94-88e2-b88dba89f26a%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.