qt - ¿Cómo puedo agregar un botón de "nueva pestaña" al lado de las pestañas de un QMdiArea en modo de vista con pestañas?
tabs qtabwidget (4)
Me gustaría tener un botón de "nueva pestaña" como Chrome o Firefox para mi QMdiArea
.
Puedo hacer un botón o un elemento de menú en algún lugar que agregue un nuevo subdocumento al elemento MDI, pero ¿cómo puedo convertirlo en una pequeña pestaña visualmente atractiva con un "+" como etiqueta? Alternativamente, me QTabWidget
suficiente con un QTabWidget
con dicho botón.
¿Por qué no hacer un botón en la última pestaña de su QTabWidget? Simplemente crea la última pestaña con un símbolo ''+'' y usa el evento currentChanged.
class Trace_Tabs(QTabWidget):
def __init__(self):
QTabWidget.__init__(self)
self._build_tabs()
def _build_tabs(self):
self.setUpdatesEnabled(True)
self.insertTab(0,QWidget(), "Trace" )
self.insertTab(1,QWidget(),'' + '')
self.currentChanged.connect(self._add_trace)
def _add_trace(self, index):
if index == self.count()-1 :
''''''last tab was clicked. add tab''''''
self.insertTab(index, QWidget(), "Trace %d" %(index+1))
self.setCurrentIndex(index)
if __name__ == ''__main__'':
app = QApplication([])
tabs = Trace_Tabs()
tabs.show()
app.exec_()
Concepto similar a la respuesta de @Garjy:
Puede usar una pestaña "en blanco" y agregar un botón a esa pestaña. Esto también reemplazará el botón "cerrar" si está utilizando TabWidget.setTabsCloseable(True)
. Es posible llegar a la pestaña "en blanco", por lo que sugiero que se combine con la respuesta de @Garjy o agregue texto u otro botón nuevo.
import sys
from qtpy.QtWidgets import QTabWidget, QWidget, QToolButton, QTabBar, QApplication
class Trace_Tabs(QTabWidget):
def __init__(self):
QTabWidget.__init__(self)
self.setTabsClosable(True)
self._build_tabs()
def _build_tabs(self):
self.insertTab(0, QWidget(), "Trace 0" )
# create the "new tab" tab with button
self.insertTab(1, QWidget(),'''')
nb = self.new_btn = QToolButton()
nb.setText(''+'') # you could set an icon instead of text
nb.setAutoRaise(True)
nb.clicked.connect(self.new_tab)
self.tabBar().setTabButton(1, QTabBar.RightSide, nb)
def new_tab(self):
index = self.count() - 1
self.insertTab(index, QWidget(), "Trace %d" % index)
self.setCurrentIndex(index)
if __name__ == ''__main__'':
app = QApplication(sys.argv)
tabs = Trace_Tabs()
tabs.show()
app.exec_()
Sé que esa pregunta está desactualizada, pero hace algún tiempo estaba buscando la implementación lista para usar de la función que solicitó. Excavé un poco e implementé esto para Qt 5 - eche un vistazo al repositorio .
La idea principal es hacer:
// Create button what must be placed in tabs row
QToolButton *tb = new QToolButton();
tb->setText("+");
// Add empty, not enabled tab to tabWidget
tabWidget->addTab(new QLabel("Add tabs by pressing /"+/""), QString());
tabWidget->setTabEnabled(0, false);
// Add tab button to current tab. Button will be enabled, but tab -- not
tabWidget->tabBar()->setTabButton(0, QTabBar::RightSide, tb);
Tendrá que escribir su propia clase para QTabBar. El botón más se puede agregar usando posicionamiento absoluto.
Tengo un código aquí para PySide; debería darle la idea básica.
class TabBarPlus(QtGui.QTabBar):
"""Tab bar that has a plus button floating to the right of the tabs."""
plusClicked = QtCore.Signal()
def __init__(self):
super().__init__()
# Plus Button
self.plusButton = QtGui.QPushButton("+")
self.plusButton.setParent(self)
self.plusButton.setFixedSize(20, 20) # Small Fixed size
self.plusButton.clicked.connect(self.plusClicked.emit)
self.movePlusButton() # Move to the correct location
# end Constructor
def sizeHint(self):
"""Return the size of the TabBar with increased width for the plus button."""
sizeHint = QtGui.QTabBar.sizeHint(self)
width = sizeHint.width()
height = sizeHint.height()
return QtCore.QSize(width+25, height)
# end tabSizeHint
def resizeEvent(self, event):
"""Resize the widget and make sure the plus button is in the correct location."""
super().resizeEvent(event)
self.movePlusButton()
# end resizeEvent
def tabLayoutChange(self):
"""This virtual handler is called whenever the tab layout changes.
If anything changes make sure the plus button is in the correct location.
"""
super().tabLayoutChange()
self.movePlusButton()
# end tabLayoutChange
def movePlusButton(self):
"""Move the plus button to the correct location."""
# Find the width of all of the tabs
size = sum([self.tabRect(i).width() for i in range(self.count())])
# size = 0
# for i in range(self.count()):
# size += self.tabRect(i).width()
# Set the plus button location in a visible area
h = self.geometry().top()
w = self.width()
if size > w: # Show just to the left of the scroll buttons
self.plusButton.move(w-54, h)
else:
self.plusButton.move(size, h)
# end movePlusButton
# end class MyClass
class CustomTabWidget(QtGui.QTabWidget):
"""Tab Widget that that can have new tabs easily added to it."""
def __init__(self):
super().__init__()
# Tab Bar
self.tab = TabBarPlus()
self.setTabBar(self.tab)
# Properties
self.setMovable(True)
self.setTabsClosable(True)
# Signals
self.tab.plusClicked.connect(self.addTab)
self.tab.tabMoved.connect(self.moveTab)
self.tabCloseRequested.connect(self.removeTab)
# end Constructor
# end class CustomTabWidget