「Qtのコントロール - タブ」の版間の差分

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動
(ページの作成:「== 概要 == Qtにおいて、タブを制御する手順を記載する。<br> <br><br> == タブ幅を揃える(等幅にする) == タブを追加すると、タブ…」)
 
115行目: 115行目:
     ~QTabWidgetEx() {}
     ~QTabWidgetEx() {}
  };
  };
</syntaxhighlight>
<br><br>
== 任意のタブに閉じるボタンを表示しない ==
全てのタブに[閉じる]ボタンを表示する場合、以下の2つの方法がある。<br>
* Qt Designerで設定する場合
*: プロパティ[tabsClosable]にチェックを入力する。
* ソースコードで設定する場合
*: 以下のように記述する。
*: <code>ui->tabWidget->setTabsClosable(true);</code>
<br>
<u>任意のタブに[閉じる]ボタンを表示しない場合</u>、ソースコードに以下を記述する。<br>
<code>setTabButton</code>メソッドの第1引数には、タブのインデックス(0オリジン)を指定する。<br>
<syntaxhighlight lang="c++">
QTabBar *tabBar = ui->tabWidget->tabBar();
tabBar->setTabButton(0,
                      static_cast<QTabBar::ButtonPosition>(tabBar->style()->styleHint(QStyle::SH_TabBar_CloseButtonPosition, nullptr, tabBar)),
                      nullptr);
  </syntaxhighlight>
  </syntaxhighlight>
<br><br>
<br><br>

2021年2月21日 (日) 01:53時点における版

概要

Qtにおいて、タブを制御する手順を記載する。


タブ幅を揃える(等幅にする)

タブを追加すると、タブに表示するテキストの文字列長に応じて、自動的にタブ幅が調整される。
全てのタブ幅を等幅にするには、QTabBar::tabSizeHintメソッドをオーバーライドして、適切なQSizeクラスを指定することで実現できる。

QTabBarクラスを継承した派生クラスをQTabWidgetクラスに設定するには、QTabWidget::setTabBarメソッドを使用すればよいが、
QTabWidget::setTabBarメソッドはprotectedであるため、QTabWidgetクラスを継承した派生クラスも作成する必要がある。

以下の例では、QTabBarクラスを継承したQTabBarExクラス、QTabWidgetクラスを継承したQTabWidgetExクラスを作成している。
また、Qt Designerにおいて、タブコントロールを右クリックして[格上げ先を指定]を選択後、QTabWidgetExクラスに格上げすること。

 // MainWindow.cpp
 
 #include "MainWindow.h"
 #include "ui_MainWindow.h"
 
 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
 {
    ui->setupUi(this);
 }
 
 MainWindow::~MainWindow()
 {
    delete ui;
 }


 // MainWindow.h
 
 #pragma once
 
 #include <QMainWindow>
 
 namespace Ui {class MainWindow;}
 
 class MainWindow : public QMainWindow
 {
    Q_OBJECT
 
 public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
 
 private:
    Ui::MainWindow *ui;
 };


 // QTabBarEx.cpp
 
 QTabBarEx::QTabBarEx(QWidget *parent) : QTabBar(parent)
 {
 }
 
 QSize QTabBarEx::tabSizeHint(int index) const
 {
    QSize size = QTabBar::tabSizeHint(index);
 
    // QSizeクラスのコンストラクタの第1引数がタブ幅、第2引数がタブの高さとなる
    return QSize(100, size.height());
 }


 // QTabBarEx.h
 
 #pragma once
 
 #include <QTabBar>
 
 class QTabBarEx : public QTabBar
 {
 public:
    explicit QTabBarEx(QWidget *parent = Q_NULLPTR);
    ~QTabBarEx() override {}
 
 protected:
    QSize tabSizeHint(int) const override;
 };


 // QTabWidgetEx.cpp
 
 #include <memory>
 #include "QTabWidgetEx.h"
 
 QTabWidgetEx::QTabWidgetEx(QWidget *parent) : QTabWidget(parent)
 {
    std::unique_ptr<QTabBarEx> newTabBar = std::make_unique<QTabBarEx>(this);
 
    // QTabWidgetのソースコード(qtabwidget.cppファイルの237〜238行目)を参考にしている
    newTabBar->setObjectName(QLatin1String("qt_tabwidget_tabbar"));
    newTabBar->setDrawBase(false);
 
    setTabBar(newTabBar);
 }


 // QTabWidgetEx.h
 
 #include <QTabWidget>
 #include "QTabBarEx.h"
 
 class QTabWidgetEx : public QTabWidget
 {
 public:
    explicit QTabWidgetEx(QWidget *parent = Q_NULLPTR);
    ~QTabWidgetEx() {}
 };



任意のタブに閉じるボタンを表示しない

全てのタブに[閉じる]ボタンを表示する場合、以下の2つの方法がある。

  • Qt Designerで設定する場合
    プロパティ[tabsClosable]にチェックを入力する。
  • ソースコードで設定する場合
    以下のように記述する。
    ui->tabWidget->setTabsClosable(true);


任意のタブに[閉じる]ボタンを表示しない場合、ソースコードに以下を記述する。
setTabButtonメソッドの第1引数には、タブのインデックス(0オリジン)を指定する。

 QTabBar *tabBar = ui->tabWidget->tabBar();
 tabBar->setTabButton(0,
                      static_cast<QTabBar::ButtonPosition>(tabBar->style()->styleHint(QStyle::SH_TabBar_CloseButtonPosition, nullptr, tabBar)),
                      nullptr);