Qtアプリでステータスバーに長いテキストを設定するとメインウィンドウの幅が広がる問題


はじまり

あるところに小さなMainWindowがありました。

そのウィンドウにはボタンが付いていたそうな。

void MainWindow::on_pushButton_clicked()
{
    status_label->setText("The quick brown fox jumps over the lazy dog");
}

ボタンを押してみると、なんと、MainWindowが広がってしまったではありませんか。

ふぐあい

MainWindowのコンストラクタで、ステータスバーにテキストを表示させるためのラベルを作っています。

    status_label = new QLabel(this);
    ui->statusBar->addWidget(status_label);

このQLabelというクラス、表示されるテキストの幅に応じて伸び縮みするように設計されています。テキストが短い分には、MainWindowのサイズは影響を受けません。しかし、MainWindowの幅よりQLabelの方が大きくなったとき、MainWindowが強制的に広げられてしまいます。

MainWindowが狭くてテキストが収まらないのは仕方ありません。そんなときはテキスト全体が表示されなくても良いということにします。でも、MainWindowが強制的にサイズ変更されてしまうのはあまり嬉しくありません。

たいさく

強制的に広がらないラベルクラスを作りましょう。

StatusLabel.h

#ifndef STATUSLABEL_H
#define STATUSLABEL_H

#include <QLabel>

class StatusLabel : public QLabel
{
    Q_OBJECT
public:
    explicit StatusLabel(QWidget *parent = 0);
    QSize minimumSizeHint() const;
};

#endif // STATUSLABEL_H

minimumSizeHint() というメンバ関数をオーバーライドします。

StatusLabel.cpp

#include "StatusLabel.h"

StatusLabel::StatusLabel(QWidget *parent)
    : QLabel(parent)
{
}

QSize StatusLabel::minimumSizeHint() const
{
    QSize sz = QLabel::minimumSizeHint();
    sz.rwidth() = 0;
    return sz;
}

最小サイズをゼロに書き換えてしまいます。

QLabelの代わりに、新しく作ったStatusLabelを使用します。

MainWindow.h

private:
    StatusLabel *status_label;

MainWindow.cpp

    status_label = new StatusLabel(this);
    ui->statusBar->addWidget(status_label);

かいけつ

テキストのはみ出た部分は描画されませんが、MainWindowが強制的に広がらなくなりました。

おしまい。