LoginSignup
2
5

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-05-19

はじまり

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

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

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

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

ふぐあい

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);

かいけつ

3.png

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

おしまい。

2
5
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
5