2010-04-11 10 views
20

Estoy usando Qt para una tarea que tengo para la universidad, y quiero usar QTabWidget para mostrar una ventana de chat muy similar a Pidgin's. Quiero que la pestaña "chat grupal" esté siempre abierta e imposible de cerrar y el resto de las pestañas de "canal privado" se puedan cerrar.Botón de cerrar solo para algunas pestañas en Qt

QTabWidgetsetTabsClosable(bool) no está ayudando.

¿Alguna idea?

Respuesta

1

supongo que puede manejar la señal tabCloseRequest y decidir si cerrar ua una pestaña concreta o no

http://doc.qt.io/archives/4.6/qtabwidget.html#tabCloseRequested

Edición: He creado un pequeño ejemplo para comprobar que funciona. Mi ejemplo es una aplicación QtGui simple con una ventana principal que tiene un widget de pestañas. Luego agregué el espacio tabCloseRequested. Aquí está el código

void MainWindow::on_tabWidget_tabCloseRequested(int index) 
{ 
    if(someCondition){ 
     return; 
    } else if(anotherCondition){ 
     ui->tabWidget->removeTab(index); 
    } 
} 

De este ejemplo solo se cerrarán las pestañas donde la condición no se aplica.

+0

no, no servirá de nada, porque cuando se recibe la señal, el evento ya se va a realizar y la señal no puede hacer nada. –

+0

Agregué el espacio tabCloseRequest en mi respuesta para aclarar cómo se puede usar. – thelinuxer

1

Debe volver a aplicar el método del evento de su widget (Evento * e), verificar el tipo de e, encontrar Cerrar Eventos y llamar al evento de la clase padre cuando puede permitir que la pestaña se cierre, o e-> ignorar() cuando lo haga no lo quiero

Nota, deberá caso de los padres() controlar los eventos othr, por lo que no acepte(), rechazar() o olvidarlos Ж)

9

Hola,

supongo que este post no va a ayudar el autor de este hilo, pero tal vez alguien más pasea por aquí.

En la mayoría de los casos, una pestaña que no se puede cerrar no solo debe ignorar el cierre, sino que tampoco debe mostrar un símbolo de cierre en su esquina. Una buena forma de llegar a esto es modificar el QTabBar que está dentro del QTabWidget.

Ejemplo:

// let tabWidget be a QTabWidget with at least one page 

QPushButton *closeButton = new QPushButton(); 
// set icon and size for PushButton, ... 
// connect Signal clicked() from closeButton with Slot closeCurrentTab(), ... 

// next line sets closeButton in right corner on tab with index 0 
tabWidget->tabBar()->setTabButton(0, QTabBar::RightSide, closeButton); 
+0

No funciona. El método tabBar() está protegido. – Jay

+1

anduve por aquí, ¡gracias! funcionó como un amuleto (en Python): style = QtGui.qApp.style() \ icon = style.standardIcon (style.SP_DockWidgetCloseButton) \ closeButton = QtGui.QPushButton (icon, '') \ closeButton.setStyleSheet ('border-style: inset;') self._detailTabs.tabBar(). setTabButton (currentTab, QtGui.QTabBar.RightSide, closeButton) – Phlip

4

Aunque TabBar() es, en efecto protegida, Klaus puntiagudo en la dirección correcta. Simplemente subclase QTabWidget e implemente un método de envoltura.

+1

BTW QTabWidget :: tabBar() ya no está protegido – Jim

30

Encontré una solución más fácil, creo. Simplemente acceda al botón de cerrar relevante y cambie su tamaño.

tabWidget->tabBar()->tabButton(0, QTabBar::RightSide)->resize(0, 0);

+15

Creo que esto es aún más fácil: 'tabWidget-> tabBar() -> tabButton (0, QTabBar :: RightSide) -> hide();' – herophuong

+2

El primer enfoque es preferible ya que recupera el espacio utilizado por el botón. Esta pregunta debe ser actualizada para responder a imo. –

+1

En Mac utilizando el modo de pestaña de documento, esto causará un error de tiempo de ejecución porque el botón de tabulación está a la izquierda. –

15

encuentra el bar (que es privado, a fin de utilizar findChild()) y retire los botones. La documentación afirma que los botones de cierre también pueden colocarse en el lado izquierdo.

QTabBar *tabBar = ui->tabWidget->findChild<QTabBar *>(); 
tabBar->setTabButton(0, QTabBar::RightSide, 0); 
tabBar->setTabButton(0, QTabBar::LeftSide, 0); 
+1

BTW QTabWidget :: tabBar() ya no está protegido – Jim

0

La mejor manera para añadir un botón a algunas pestañas y no en otro es definir una subclase de QTabWidget por tomarse el QTabBar que es un potected! El código siguiente se ha probado y funciona:

//TabWidget.h 

#ifndef TABWIDGET_H 
#define TABWIDGET_H 
#include <QTabWidget> 

class TabWidget : public QTabWidget { 
public: 
    TabWidget(QWidget *parent); 
    ~TabWidget(); 
    QTabBar *tabBar() const; 
}; 
#endif /* TABWIDGET_H */ 

//TabWidget.cpp 

#include "TabWidget.h" 
TabWidget::TabWidget(QWidget * p=0) : QTabWidget(p) {} 

TabWidget::~TabWidget() {} 

QTabBar * TabWidget::tabBar() const {return QTabWidget::tabBar();} 

Para poder utilizar esta subclase y crear una nueva pestaña con un botón personalizado que tiene que siguiendo estas instrucciones (ui-> TabWidget es una QTabWidget con setClosableTabs = false):

TabWidget *t = (TabWidget *) ui->tabWidget; 
t->addTab(new QWidget, "empty"); 
QTabBar *tab = t->tabBar(); 
QPushButton *b = new QPushButton(); 
b->setText("x"); 
tab->setTabButton(tab->count() -1, QTabBar::RightSide, b); 
connect(b,SIGNAL(...),this,SLOT(...)); 
+0

BTW QTabWidget :: tabBar() ya no está protegido – Jim

Cuestiones relacionadas