QTabBar::tabBarClicked()シグナルのしくみとサンプルコード


シグナルの引数

このシグナルは、以下の引数を受け取ります。

  • index: クリックされたタブのインデックス

シグナルの接続

QTabBar::tabBarClicked() シグナルをスロットに接続するには、以下のコードを使用します。

connect(tabBar, &QTabBar::tabBarClicked, this, &MyClass::onTabBarClicked);

このコードは、tabBar という名前の QTabBar オブジェクトの tabBarClicked() シグナルを、MyClass クラスの onTabBarClicked() メソッドに接続します。

onTabBarClicked() メソッド

onTabBarClicked() メソッドは、クリックされたタブのインデックスを受け取り、それに応じてアプリケーションの動作を変更することができます。以下の例は、クリックされたタブのインデックスに基づいて QTabWidget の現在のインデックスを設定する方法を示しています。

void MyClass::onTabBarClicked(int index)
{
    tabWidget->setCurrentIndex(index);
}

以下の例は、3 つのタブを持つ QTabWidget を作成し、各タブをクリックしたときに対応するウィジェットを表示する方法を示しています。

#include <QApplication>
#include <QTabWidget>
#include <QLabel>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QTabWidget tabWidget;

    QLabel label1("Tab 1");
    QLabel label2("Tab 2");
    QLabel label3("Tab 3");

    tabWidget.addTab(&label1, "Tab 1");
    tabWidget.addTab(&label2, "Tab 2");
    tabWidget.addTab(&label3, "Tab 3");

    connect(tabWidget.tabBar(), &QTabBar::tabBarClicked, &tabWidget, &QTabWidget::setCurrentIndex);

    tabWidget.show();

    return app.exec();
}

このコードを実行すると、3 つのタブが表示されます。ユーザーがタブをクリックすると、対応するウィジェットが表示されます。



例 1: タブバーのクリックされたタブのインデックスを取得する

#include <QApplication>
#include <QTabWidget>
#include <QLabel>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QTabWidget tabWidget;

    QLabel label1("Tab 1");
    QLabel label2("Tab 2");
    QLabel label3("Tab 3");

    tabWidget.addTab(&label1, "Tab 1");
    tabWidget.addTab(&label2, "Tab 2");
    tabWidget.addTab(&label3, "Tab 3");

    connect(tabWidget.tabBar(), &QTabBar::tabBarClicked, &tabWidget, &QTabWidget::setCurrentIndex);

    tabWidget.show();

    return app.exec();
}

例 2: クリックされたタブのインデックスに基づいて処理を行う

#include <QApplication>
#include <QTabWidget>
#include <QLabel>
#include <QMessageBox>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QTabWidget tabWidget;

    QLabel label1("Tab 1");
    QLabel label2("Tab 2");
    QLabel label3("Tab 3");

    tabWidget.addTab(&label1, "Tab 1");
    tabWidget.addTab(&label2, "Tab 2");
    tabWidget.addTab(&label3, "Tab 3");

    connect(tabWidget.tabBar(), &QTabBar::tabBarClicked, &tabWidget, &MyClass::onTabBarClicked);

    tabWidget.show();

    return app.exec();
}

class MyClass : public QObject
{
public:
    MyClass(QObject *parent = nullptr) : QObject(parent) {}

public slots:
    void onTabBarClicked(int index)
    {
        switch (index) {
        case 0:
            QMessageBox::information(this, "Tab 1", "Tab 1 がクリックされました。");
            break;
        case 1:
            QMessageBox::information(this, "Tab 2", "Tab 2 がクリックされました。");
            break;
        case 2:
            QMessageBox::information(this, "Tab 3", "Tab 3 がクリックされました。");
            break;
        }
    }
};

このコードを実行すると、3 つのタブが表示されます。ユーザーがタブをクリックすると、対応するメッセージボックスが表示されます。

説明

  • 例 2 は、QTabBar::tabBarClicked() シグナルを MyClass::onTabBarClicked() スロットに接続し、クリックされたタブのインデックスに基づいて処理を行う方法を示しています。
  • 例 1 は、QTabBar::tabBarClicked() シグナルを QTabWidget::setCurrentIndex() スロットに接続することで、クリックされたタブのインデックスを取得する方法を示しています。

上記以外にも、QTabBar::tabBarClicked() シグナルを使用して様々な処理を行うことができます。例えば、以下のような処理が可能です。

  • クリックされたタブに基づいてネットワークリクエストを行う
  • クリックされたタブに基づいてデータを読み込む
  • クリックされたタブに基づいて別のウィジェットを表示する


QTabBar::currentChanged() シグナルを使用する

QTabBar::currentChanged() シグナルは、QTabWidget の現在のタブが変更されたときに発生するシグナルです。このシグナルを受け取ることで、現在のタブのインデックスを取得し、それに応じてアプリケーションの動作を変更することができます。

#include <QApplication>
#include <QTabWidget>
#include <QLabel>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QTabWidget tabWidget;

    QLabel label1("Tab 1");
    QLabel label2("Tab 2");
    QLabel label3("Tab 3");

    tabWidget.addTab(&label1, "Tab 1");
    tabWidget.addTab(&label2, "Tab 2");
    tabWidget.addTab(&label3, "Tab 3");

    connect(tabWidget, &QTabWidget::currentChanged, &tabWidget, &MyClass::onCurrentChanged);

    tabWidget.show();

    return app.exec();
}

class MyClass : public QObject
{
public:
    MyClass(QObject *parent = nullptr) : QObject(parent) {}

public slots:
    void onCurrentChanged(int index)
    {
        switch (index) {
        case 0:
            // Tab 1 が選択されたときの処理
            break;
        case 1:
            // Tab 2 が選択されたときの処理
            break;
        case 2:
            // Tab 3 が選択されたときの処理
            break;
        }
    }
};

QTabBar::mousePressEvent() メソッドを使用する

QTabBar::mousePressEvent() メソッドは、ユーザーがタブバー上にマウスボタンを押したときに呼び出されます。このメソッド内で、クリックされたタブのインデックスを取得し、それに応じてアプリケーションの動作を変更することができます。

#include <QApplication>
#include <QTabWidget>
#include <QLabel>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QTabWidget tabWidget;

    QLabel label1("Tab 1");
    QLabel label2("Tab 2");
    QLabel label3("Tab 3");

    tabWidget.addTab(&label1, "Tab 1");
    tabWidget.addTab(&label2, "Tab 2");
    tabWidget.addTab(&label3, "Tab 3");

    tabWidget.installEventFilter(this);

    tabWidget.show();

    return app.exec();
}

bool MyClass::eventFilter(QObject *obj, QEvent *event)
{
    if (event->type() == QEvent::MouseButtonPress) {
        QTabBar *tabBar = static_cast<QTabBar *>(obj);
        QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);

        if (mouseEvent->button() == Qt::LeftButton) {
            int index = tabBar->tabAt(mouseEvent->pos());

            if (index != -1) {
                // クリックされたタブの処理
            }
        }
    }

    return QObject::eventFilter(obj, event);
}

QTabBar::tabBarContextMenuEvent() メソッドを使用する

QTabBar::tabBarContextMenuEvent() メソッドは、ユーザーがタブバー上で右クリックしたときに呼び出されます。このメソッド内で、クリックされたタブのインデックスを取得し、それに応じてコンテキストメニューを表示することができます。

#include <QApplication>
#include <QTabWidget>
#include <QLabel>
#include <QMenu>
#include <QAction>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QTabWidget tabWidget;

    QLabel label1("Tab 1");
    QLabel label2("Tab 2");
    QLabel label3("Tab 3");

    tabWidget.addTab(&label1, "Tab 1");
    tabWidget.addTab(&label2, "Tab 2");
    tabWidget.addTab(&label3, "Tab 3");

    connect(tabWidget.tabBar(), &QTabBar::tabBarContextMenuEvent, this, &MyClass