Закрываемые вкладки QTabWidget, но не все

В фрагменте кода Qt/С++ у меня есть класс QTabWidget с разными вкладками. Я хотел бы добавить последнюю вкладку "+", поэтому, когда пользователь нажимает на нее, я создаю новую вкладку.
Однако я хотел бы, чтобы все мои вкладки закрывались ("x" справа от вкладки ), за исключением последнего, где я не хочу, чтобы отображался «x». Как я могу иметь эту гранулярность в закрывающемся флаге?


person Laurent Crivello    schedule 24.02.2016    source источник
comment
Возможный дубликат кнопки "Закрыть" только для некоторых вкладок в Qt   -  person Dmitry Sazonov    schedule 24.02.2016
comment
Это может быть решением, но не мешает отображать «x» рядом с моим «+», чего я хотел бы избежать.   -  person Laurent Crivello    schedule 24.02.2016
comment
Я не понимаю... Вам не нужно показывать кнопку закрытия для одной вкладки - я даю вам решение. Пожалуйста, уточните свой вопрос.   -  person Dmitry Sazonov    schedule 24.02.2016
comment
Это правда. Если открыто 5 вкладок, я хочу, чтобы на 4 первых отображалась кнопка закрытия «x», а на 5-й вкладке ничего не было.   -  person Laurent Crivello    schedule 24.02.2016


Ответы (1)


Удивлен, увидев, что на это еще не ответили. Было немного времени, и я реализовал рабочий пример. Обратите внимание, что вместо того, чтобы использовать одну из вкладок в качестве кнопки «+», я использовал QToolButton, тем самым упрощая закрытие вкладок с помощью QTabWidget::setTabsClosable(bool)

главное окно.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTabWidget>
#include <QToolButton>
#include <QLabel>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    QTabWidget* _pTabWidget;

private slots:
    void slotAddTab();
    void slotCloseTab(int);
};

#endif // MAINWINDOW_H

главное окно.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    _pTabWidget = new QTabWidget(this);
    this->setCentralWidget(_pTabWidget);

    // Create button what must be placed in tabs row
    QToolButton* tb = new QToolButton(this);
    tb->setText("+");

    // Add empty, not enabled tab to tabWidget
    _pTabWidget->addTab(new QLabel("Add tabs by pressing \"+\""), QString());
    _pTabWidget->setTabEnabled(0, false);

    // Add tab button to current tab. Button will be enabled, but tab -- not
    _pTabWidget->tabBar()->setTabButton(0, QTabBar::RightSide, tb);

    // Setting tabs closable and movable
    _pTabWidget->setTabsClosable(true);
    _pTabWidget->setMovable(true);
    connect(tb,SIGNAL(clicked()),this,SLOT(slotAddTab()));
    connect(_pTabWidget,SIGNAL(tabCloseRequested(int)),this,SLOT(slotCloseTab(int)));
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::slotAddTab()
{
    QWidget* newTab = new QWidget(_pTabWidget);
    _pTabWidget->addTab(newTab, tr("Tab %1").arg(QString::number(_pTabWidget->count())));
    _pTabWidget->setCurrentWidget(newTab);
}

void MainWindow::slotCloseTab(int index)
{
    delete _pTabWidget->widget(index);
}

main.cpp

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}
person Nithish    schedule 03.03.2016
comment
Кажется, нужно добавить #include <QTabBar> в mainwindow.h, иначе создатель Qt сообщит об ошибке: использование неопределенного типа 'QTabBar' - person Wade Wang; 12.07.2021