2010-04-11 1 views
20

Sto utilizzando Qt per un compito che ho per il college, e voglio usare QTabWidget per visualizzare una finestra di chat molto simile a Pidgin's. Voglio rendere la scheda "chat di gruppo" sempre aperta e impossibile da chiudere e il resto delle schede "canale privato" chiudibili.Chiudi pulsante solo per alcune schede in Qt

QTabWidget 's setTabsClosable(bool) non aiuta.

Qualche idea?

risposta

1

Credo che si può gestire il segnale tabCloseRequest e decidere se u'll chiudere una determinata scheda o no

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

Edit: ho creato un piccolo esempio di check it out. Il mio esempio è una semplice applicazione QtGui con una finestra principale che ha un tabwidget. Ho quindi aggiunto lo slot tabCloseRequested. Ecco il codice

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

Da questo esempio solo schede in cui la condizione non si applica sarà chiuso.

+0

no, non sarà d'aiuto, perché quando il segnale ricevuto, l'evento è già in corso e il segnale non può fare nulla. –

+0

Ho aggiunto lo spazio tabCloseRequest nella mia risposta per chiarire come può essere utilizzato. – thelinuxer

1

È necessario reimplementare il metodo evento (evento * e) del widget, controllare il tipo di e, trovare CloseEvents e chiamare l'evento della classe genitore quando è possibile consentire la chiusura della scheda o e-> ignore() quando si esegue non lo voglio

nota, allora si deve evento del genitore() gestire gli eventi othr, in modo da non accettare(), rifiutare() o Ж)

9

Hallo,

Credo che questo post non aiuterà dimenticare l'autore di questo thread ma forse qualcun altro vaga qui.

Nella maggior parte dei casi una scheda non chiudibile non dovrebbe ignorare solo il closevent, ma non dovrebbe mostrare un simbolo di chiusura nel suo angolo. Un buon modo per raggiungerlo è modificare la barra di QTab che si trova all'interno di QTabWidget.

Esempio:

// 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

Non funziona. Il metodo tabBar() è protetto. – Jay

+1

Ho vagato qui - grazie! ha funzionato come un fascino (in Python): style = QtGui.qApp.style() \ icon = style.standardIcon (style.SP_DockWidgetCloseButton) \ closeButton = QtGui.QPushButton (icona, '') \ closeButton.setStyleSheet ('border-style: inset;') self._detailTabs.tabBar(). setTabButton (currentTab, QtGui.QTabBar.RightSide, closeButton) – Phlip

4

Anche se TabBar() è infatti protetto, Klaus rilevare nella giusta direzione. Semplicemente sottoclasse QTabWidget e implementa un metodo wrapper.

+1

BTW QTabWidget :: tabBar() non è più protetto – Jim

30

Ho trovato una soluzione più semplice, penso. Basta accedere al relativo pulsante di chiusura e ridimensionarlo.

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

+15

Penso che questo sia ancora più semplice: 'tabWidget-> tabBar() -> tabButton (0, QTabBar :: RightSide) -> hide();' – herophuong

+2

Il primo approccio è preferibile in quanto recupera lo spazio utilizzato dal pulsante. Questa domanda dovrebbe essere svitata per rispondere a imo. –

+1

Sul Mac utilizzando la modalità scheda documento, ciò causerà un errore di runtime perché il pulsante della scheda è sulla sinistra. –

15

Trova il bar (che è privato, in modo da utilizzare findChild()) e rimuovere i pulsanti. La documentazione afferma che i pulsanti vicini possono essere posizionati anche sul lato sinistro.

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

BTW QTabWidget :: tabBar() non è più protetto – Jim

0

Il modo migliore per l'aggiunta di un pulsante per alcune schede e non in altri è quello di definire una sottoclasse di QTabWidget per prendere il QTabBar che è un potected! Il codice di seguito viene testato e funziona:

//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();} 

Per utilizzare questa sottoclasse e creare una nuova scheda con un pulsante personalizzato è necessario seguendo queste istruzioni (UI-> TabWidget è un 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() non è più protetto – Jim