Кнопка закрытия только для некоторых вкладок в Qt - PullRequest
22 голосов
/ 11 апреля 2010

Я использую Qt для задания, которое у меня есть для колледжа, и я хочу использовать QTabWidget для отображения окна чата, очень похожего на Pidgin's . Я хочу, чтобы вкладка «групповой чат» всегда была открыта и закрывалась, а остальные вкладки «частного канала» закрывались.

QTabWidget х setTabsClosable(bool) не помогает.

Есть идеи?

Ответы [ 7 ]

33 голосов
/ 16 мая 2012

Я нашел более простое решение, я думаю. Просто получите доступ к соответствующей кнопке закрытия и измените ее размер.

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

16 голосов
/ 24 декабря 2012

Найдите панель (она приватная, поэтому используйте findChild ()) и удалите кнопки. В документации утверждается, что кнопки закрытия могут быть размещены и на левой стороне.

QTabBar *tabBar = ui->tabWidget->findChild<QTabBar *>();
tabBar->setTabButton(0, QTabBar::RightSide, 0);
tabBar->setTabButton(0, QTabBar::LeftSide, 0);
9 голосов
/ 18 апреля 2011

Алло,

Полагаю, этот пост не поможет автору этой темы, но, возможно, кто-то еще блуждает здесь.

В большинстве случаев закрывающаяся вкладка должна не только игнорировать закрытие, она также не должна отображать символ закрытия в своем углу. Хороший способ достичь этого - изменить QTabBar, который находится внутри QTabWidget.

Пример:

// 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);
4 голосов
/ 30 сентября 2011

Хотя tabBar () действительно защищен, Клаус указал в правильном направлении. Просто создайте подкласс QTabWidget и реализуйте метод-оболочку.

1 голос
/ 13 апреля 2010

Вам следует переопределить метод события (Event * e) вашего виджета, проверить тип e, выяснить CloseEvents и вызвать событие родительского класса, когда вы можете разрешить закрытие вкладки, или e-> ignore (), если вы этого не сделаете хочу.

Обратите внимание, что вы должны использовать родительский метод event () для обработки других событий, поэтому не принимайте (), не отклоняйте () и не забывайте их Ж)

1 голос
/ 11 апреля 2010

Я думаю, вы можете обработать сигнал tabCloseRequest и решить, закроете ли вы данную вкладку или нет

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

Редактировать: я создал небольшой пример, чтобы проверить это. Мой пример - простое приложение QtGui с главным окном, в котором есть вкладка. Затем я добавил слот tabCloseRequested. Вот код

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

Из этого примера будут закрыты только вкладки, где условие не применяется.

0 голосов
/ 11 января 2013

Лучший способ добавить кнопку на некоторые вкладки, а не на другие, - это определить подкласс QTabWidget для взятия QTabBar, который является потенциальным! Код ниже протестирован и работает:

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

Для использования этого подкласса и создания новой вкладки с пользовательской кнопкой вы должны следовать этой инструкции (ui-> tabWidget - это QTabWidget с 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(...));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...