qt tabs qtabwidget qmdiarea

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