25 Stimmen

Schaltfläche "Schließen" nur für einige Registerkarten in Qt

Ich verwende Qt für eine Aufgabe, die ich für das College habe, und ich möchte verwenden QTabWidget um ein Chat-Fenster anzuzeigen, ähnlich wie Pidgins . Ich möchte, dass die Registerkarte "Gruppenchat" immer geöffnet ist und nicht geschlossen werden kann und die übrigen Registerkarten des "privaten Channels" geschlossen werden können.

QTabWidget 's setTabsClosable(bool) ist nicht hilfreich.

Irgendwelche Ideen?

41voto

etetamar Punkte 401

Ich habe eine einfachere Lösung gefunden, denke ich. Rufen Sie einfach die entsprechende Schaltfläche zum Schließen auf und ändern Sie die Größe.

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

15 Stimmen

Ich denke, das ist noch einfacher: tabWidget->tabBar()->tabButton(0, QTabBar::RightSide)->hide();

3 Stimmen

Der erste Ansatz ist vorzuziehen, da er den von der Schaltfläche belegten Platz zurückgewinnt. Diese Frage sollte zur Beantwortung imo hochgestuft werden.

2 Stimmen

Auf dem Mac führt dies zu einem Laufzeitfehler, da sich die Tabulatortaste auf der linken Seite befindet.

18voto

user66960 Punkte 189

Suchen Sie die Leiste (sie ist privat, also verwenden Sie findChild()) und entfernen Sie die Schaltflächen. Die Dokumentation besagt, dass die Schaltflächen zum Schließen auch auf der linken Seite platziert werden können.

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

1 Stimmen

BTW QTabWidget::tabBar() ist nicht mehr geschützt

9voto

Klaus Punkte 91

Hallo,

Ich vermute, dass dieser Beitrag dem Verfasser dieses Threads nicht weiterhilft, aber vielleicht verirrt sich ja noch jemand hierher.

In den meisten Fällen sollte eine nicht verschließbare Registerkarte nicht nur das Schließereignis ignorieren, sondern auch kein Schließersymbol in ihrer Ecke anzeigen. Ein guter Weg, dies zu erreichen, ist die Änderung der QTabBar, die sich innerhalb des QTabWidget befindet.

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

1 Stimmen

Ich bin hierher gewandert - danke! Es funktionierte wie ein Zauber (in 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)

0 Stimmen

Für alle anderen, die sich hier von Python aus wundern, wollte ich die Schaltfläche vollständig ausblenden und konnte nicht bekommen, es zu arbeiten, indem Sie eine leere QPushButton. Aber die Übergabe None funktionierte stattdessen perfekt: TabWidget.tabBar().setTabButton(0, QTabBar.RightSide, None)

4voto

DevilsAdvocate Punkte 41

Obwohl tabBar() tatsächlich geschützt ist, wies Klaus in die richtige Richtung. Einfach QTabWidget subclass und eine Wrapper-Methode implementieren.

1 Stimmen

BTW QTabWidget::tabBar() ist nicht mehr geschützt

1voto

thelinuxer Punkte 629

Ich schätze, Sie können das tabCloseRequest-Signal behandeln und entscheiden, ob Sie eine bestimmte Registerkarte schließen oder nicht

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

Edit: Ich habe ein kleines Beispiel erstellt, um es zu überprüfen. Mein Beispiel ist eine einfache QtGui-Anwendung mit einem Hauptfenster, das ein Tabwidget hat. Ich habe dann den tabCloseRequested-Slot hinzugefügt. Hier ist der Code

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

In diesem Beispiel werden nur die Registerkarten geschlossen, auf die die Bedingung nicht zutrifft.

0 Stimmen

Nein, es wird nicht helfen, denn wenn das Signal empfangen wird, wird das Ereignis bereits ausgeführt, und das Signal kann nichts mehr tun.

0 Stimmen

Ich habe den tabCloseRequest-Slot in meiner Antwort hinzugefügt, um zu verdeutlichen, wie er verwendet werden kann.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X