Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

はじまり

あるところに小さな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が強制的に広がらなくなりました。

おしまい。

soramimi_jp
C++とQtが好き。電子工作もやる。第一種情報処理技術者と第二種電気工事士を持ってる。ワンチップマイコンのファームウェアからPCのデスクトップアプリまで。PCより大規模なシステムは守備範囲外。うちの子かわいい(ドール)。40代独身おっさん(´・ω・`)
http://www.soramimi.jp/
AI-medical-service
近未来の内視鏡医療を実現する医療ベンチャー
https://www.ai-ms.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away