Ответ 1
Я нашел более легкое решение, я думаю. Просто нажмите соответствующую кнопку закрытия и измените ее размер.
tabWidget->tabBar()->tabButton(0, QTabBar::RightSide)->resize(0, 0);
Я использую Qt для задания, которое у меня есть для колледжа, и я хочу использовать QTabWidget
для отображения окна чата, похожего на Pidgin, Я хочу, чтобы вкладка "групповой чат" всегда открывалась и закрывалась, а остальные вкладки "частный канал" закрывались.
QTabWidget
setTabsClosable(bool)
не помогает.
Любые идеи?
Я нашел более легкое решение, я думаю. Просто нажмите соответствующую кнопку закрытия и измените ее размер.
tabWidget->tabBar()->tabButton(0, QTabBar::RightSide)->resize(0, 0);
Найдите панель (она приватная, поэтому используйте findChild()) и удалите кнопки. Документация утверждает, что закрытые кнопки могут быть размещены также на левой стороне.
QTabBar *tabBar = ui->tabWidget->findChild<QTabBar *>();
tabBar->setTabButton(0, QTabBar::RightSide, 0);
tabBar->setTabButton(0, QTabBar::LeftSide, 0);
Алло,
Я предполагаю, что это сообщение не поможет автору этой темы, но, возможно, кто-то еще бродит здесь.
В большинстве случаев неблокируемая вкладка должна не только игнорировать близость, но также и не показывать символ закрытия в своем углу. Хороший способ достичь этого - изменить 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);
Хотя tabBar() действительно защищен, Клаус указал в правильном направлении. Просто подкласс QTabWidget и реализовать метод обертки.
Я думаю, вы можете обработать сигнал 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);
}
}
В этом примере закрываются только табуляции, в которых условие не применяется.
Вы должны переопределить метод виджета (Event * e), проверить тип e, найти CloseEvents и вызвать событие родительского класса, если вы можете разрешить закрытие вкладки, или e- > игнорировать(), когда вы не выполняете хочу этого.
Обратите внимание, что вы должны родительское событие() обрабатывать другие события, поэтому не принимайте(), reject() или забывайте их Ж)
Лучший способ добавить кнопку на некоторые вкладки, а не в другую, - определить подкласс 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(...));