Question Bouton Fermer uniquement pour certains onglets de Qt


J'utilise Qt pour une mission que j'ai pour l'université et je veux utiliser QTabWidget pour afficher une fenêtre de discussion un peu comme Pidgin. Je veux que l'onglet "discussion en groupe" soit toujours ouvert et impossible à fermer et que le reste des onglets "canal privé" soient fermables.

QTabWidget's setTabsClosable(bool) ne aide pas.

Des idées?


21
2018-04-11 08:42


origine


Réponses:


Je trouve une solution plus facile, je pense. Accédez simplement au bouton de fermeture correspondant et redimensionnez-le.

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


31
2018-05-16 04:37



Trouvez la barre (c'est privé, utilisez donc findChild ()) et enlevez les boutons. La documentation prétend que les boutons de fermeture peuvent également être placés sur le côté gauche.

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

15
2017-12-24 14:02



Bonjour,

Je suppose que cet article n'aidera pas l'auteur de ce sujet, mais peut-être que quelqu'un d'autre erre ici.

Dans la plupart des cas, un onglet qui ne peut pas être fermé doit non seulement ignorer le facteur de fermeture, mais il ne doit pas non plus afficher de symbole de fermeture dans son coin. Un bon moyen d'y parvenir est de modifier le QTabBar qui se trouve dans le QTabWidget.

Exemple:

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

9
2018-04-18 08:56



Bien que tabBar () soit effectivement protégé, Klaus a indiqué la bonne direction. Simplement sous-classer QTabWidget et implémenter une méthode wrapper.


4
2017-09-30 12:00



Vous devez réimplémenter la méthode d'événement (Event * e) de votre widget, vérifier le type de e, trouver CloseEvents et appeler l'événement de la classe parent lorsque vous pouvez autoriser la fermeture de l'onglet ou e-> ignore () lorsque vous ne le souhaitez pas.

Notez que vous devez alors parent les événements () gérer les autres événements, donc n'acceptez pas (), rejetez () ou oubliez-les Ж)


1
2018-04-12 21:27



Je suppose que vous pouvez gérer le signal tabCloseRequest et décider si vous allez fermer un onglet donné ou non

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

Edit: J'ai créé un petit exemple pour le vérifier. Mon exemple est une application QtGui simple avec une fenêtre principale dotée d'un widget. J'ai ensuite ajouté le slot tabCloseRequested. Voici le code

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

Dans cet exemple, seuls les onglets dont la condition ne s'applique pas seront fermés.


1
2018-04-11 09:43



La meilleure façon d’ajouter un bouton de commande à certains onglets et pas d’autre est de définir une sous-classe de QTabWidget pour prendre le QTabBar qui est un objet suspect! Le code ci-dessous est testé et fonctionne:

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

Pour utiliser cette sous-classe et créer un nouvel onglet avec un bouton personnalisé, vous devez suivre ces instructions (ui-> tabWidget est un QTabWidget avec 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
2018-01-11 14:17