Подтвердить что ты не робот

Закрыть кнопку только для некоторых вкладок в Qt

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

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

Любые идеи?

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

Алло,

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

В большинстве случаев неблокируемая вкладка должна не только игнорировать близость, но также и не показывать символ закрытия в своем углу. Хороший способ достичь этого - изменить 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

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

Ответ 5

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

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

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

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

В этом примере закрываются только табуляции, в которых условие не применяется.

Ответ 6

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

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

Ответ 7

Лучший способ добавить кнопку на некоторые вкладки, а не в другую, - определить подкласс 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(...));