The solution by @Avaris worked great for me. Since I am working with PySide6 I had to make some minor updates to imports and Qt references, mainly moving items from QtGUI to QtWidgets. Posted below is @Avaris' code updated to work with PySide6.
# !/usr/bin/env python
# -.- coding: utf-8 -.-
import sys
from PySide6 import QtCore
from PySide6.QtWidgets import (
QApplication,
QWidget,
QHBoxLayout,
QPushButton,
QTabWidget,
QVBoxLayout,
)
class Tab(QWidget):
popOut = QtCore.Signal(QWidget)
popIn = QtCore.Signal(QWidget)
def __init__(self, parent=None):
super(Tab, self).__init__(parent)
popOutButton = QPushButton("Pop Out")
popOutButton.clicked.connect(lambda: self.popOut.emit(self))
popInButton = QPushButton("Pop In")
popInButton.clicked.connect(lambda: self.popIn.emit(self))
layout = QHBoxLayout(self)
layout.addWidget(popOutButton)
layout.addWidget(popInButton)
class Window(QWidget):
def __init__(self, parent=None):
super(Window, self).__init__()
self.button = QPushButton("Add Tab")
self.button.clicked.connect(self.createTab)
self._count = 0
self.tab = QTabWidget()
layout = QVBoxLayout(self)
layout.addWidget(self.button)
layout.addWidget(self.tab)
def createTab(self):
tab = Tab()
tab.setWindowTitle("%d" % self._count)
tab.popIn.connect(self.addTab)
tab.popOut.connect(self.removeTab)
self.tab.addTab(tab, "%d" % self._count)
self._count += 1
def addTab(self, widget):
if self.tab.indexOf(widget) == -1:
widget.setWindowFlags(QtCore.Qt.Widget)
self.tab.addTab(widget, widget.windowTitle())
def removeTab(self, widget):
index = self.tab.indexOf(widget)
if index != -1:
self.tab.removeTab(index)
widget.setWindowFlags(QtCore.Qt.Window)
widget.show()
if __name__ == "__main__":
app = QApplication(sys.argv)
w = Window()
w.show()
sys.exit(app.exec_())