Qt

【C++】Qt QLabelの使い方:テキスト表示と画像処理の基本とカスタマイズ方法

QtのQLabelは、テキストや画像の表示に便利なウィジェットです。

簡単な使い方は、コード中でQLabel label("Hello, world!");としてインスタンス化し、label.show();で表示させる方法があります。

ラベルの文字色や背景色は、setStyleSheetを用いることで調整でき、画像表示にはsetPixmapが利用できます。

シンプルな作りながら、様々なカスタマイズが可能です。

QLabelの基本機能

テキスト表示機能

インスタンス生成と基本プロパティ設定

QLabelを利用する際は、まずインスタンスを生成します。

例えば、以下のコードでQLabelのオブジェクトを生成し、シンプルなテキストを表示することができます。

#include <QApplication>
#include <QLabel>
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    // QLabelインスタンスの生成と初期テキストの設定
    QLabel label("初めまして!");
    label.setWindowTitle("QLabelサンプル");
    label.resize(300, 100); // ウィンドウサイズの設定
    label.show();
    return app.exec();
}
(ウィンドウに「初めまして!」というテキストが表示される)

このサンプルは、QLabelの基本的な使用法をわかりやすく示していて、QLabelのプロパティを設定する際の流れが参考になれば嬉しいです。

テキスト設定と更新方法

動的にテキストを更新する必要がある場合、setTextメソッドを使用します。

たとえば、ユーザーの操作に合わせて内容が変わるような場合に便利です。

以下のコード例では、ボタンのクリックに応じてラベルのテキストを変更する方法を紹介します。

#include <QApplication>
#include <QLabel>
#include <QPushButton>
#include <QVBoxLayout>
#include <QWidget>
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QWidget window;
    QVBoxLayout layout(&window);
    QLabel label("旧テキスト");
    QPushButton button("テキスト更新");
    layout.addWidget(&label);
    layout.addWidget(&button);
    // ボタンが押されたらテキストを更新
    QObject::connect(&button, &QPushButton::clicked, [&label](){
        label.setText("新しいテキストへ変更!");
        label.adjustSize(); // 変更に合わせサイズも更新
    });
    window.setWindowTitle("テキスト更新サンプル");
    window.show();
    return app.exec();
}
(ウィンドウに「旧テキスト」と書かれたラベルと「テキスト更新」ボタンが表示され、
ボタンを押すとラベルのテキストが「新しいテキストへ変更!」に変わる)

このようなシンプルなイベント処理でテキスト更新が実現できるため、動的なUIの実装に役立つサンプルコードとなっています。

文字色やフォントの調整(setStyleSheet利用)

QLabelの見た目を変更する場合、setStyleSheetを利用して文字色やフォント、背景色などを設定することができます。

以下は、文字色を赤に、フォントサイズを大きく設定する例です。

#include <QApplication>
#include <QLabel>
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QLabel label("スタイルシートでデザイン");
    // 文字色を赤、フォントサイズを24pxに設定
    label.setStyleSheet("color: red; font-size: 24px;");
    label.show();
    return app.exec();
}
(ウィンドウに赤い文字で「スタイルシートでデザイン」と表示される)

スタイルシートを活用することで、視覚的に鮮明なUIを手軽に作成することができます。

自動サイズ調整(adjustSize)の活用

テキストの長さに合わせてQLabelのサイズを自動調整する場合、adjustSizeメソッドを使用するのがおすすめです。

下記のコードでは、テキストを変更後にサイズを自動で更新する例を紹介します。

#include <QApplication>
#include <QLabel>
#include <QPushButton>
#include <QVBoxLayout>
#include <QWidget>
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QWidget window;
    QVBoxLayout layout(&window);
    QLabel label("初期テキスト");
    QPushButton button("長いテキストに変更");
    layout.addWidget(&label);
    layout.addWidget(&button);
    QObject::connect(&button, &QPushButton::clicked, [&label](){
        label.setText("これは非常に長いテキストです。QLabelはテキスト内容に合わせてサイズを調整できるので、表示内容がしっかり見えるようになります。");
        label.adjustSize();
    });
    window.show();
    return app.exec();
}
(ボタンを押すと、ラベルのテキストが長い文章に変わり、自動的にサイズが調整される)

実際のシーンでテキストが動的に変わる場合に、レイアウトが乱れずに表示できる点が特徴です。

画像表示機能

画像の読み込みと表示(setPixmapの利用)

QLabelは、画像の表示にも対応しています。

画像を表示するためには、setPixmapメソッドを使用し、画像ファイルをQPixmapで読み込みます。

下記サンプルは、画像ファイルが存在する環境でその画像を表示する例です。

#include <QApplication>
#include <QLabel>
#include <QPixmap>
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QLabel label;
    // 画像ファイル「sample.png」をQPixmapで読み込み、QLabelにセット
    QPixmap pixmap("sample.png");
    label.setPixmap(pixmap);
    label.setWindowTitle("画像表示サンプル");
    label.show();
    return app.exec();
}
(ウィンドウに「sample.png」の画像が表示される)

このコードでは、画像ファイルが正しく読み込めることを前提にしており、画像のパスを変更することで複数の画像に対応できます。

画像スケーリングとアスペクト比保持

画像の大きさがウィンドウと合わない場合は、QLabelのサイズに合わせて画像をスケーリングすることができます。

アスペクト比を維持しながら調整するには、Qt::KeepAspectRatioを指定してscaledメソッドを利用します。

#include <QApplication>
#include <QLabel>
#include <QPixmap>
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QLabel label;
    label.resize(400, 300);
    QPixmap pixmap("sample.png");
    // QLabelのサイズに合わせ、アスペクト比を保持して画像をスケーリング
    label.setPixmap(pixmap.scaled(label.size(), Qt::KeepAspectRatio));
    label.setWindowTitle("画像スケーリングサンプル");
    label.show();
    return app.exec();
}
(ウィンドウ内に画像がウィンドウのサイズに合わせ正しい比率で表示される)

画像が歪むことなく表示されるため、視覚的なバランスを保ちながら、様々な画面サイズに対応できます。

scaledメソッドによる画像調整

より自由に画像のサイズを変更する際は、scaledメソッドの他のフラグも利用できます。

例えば、平滑化フィルターQt::SmoothTransformationを追加することで、より滑らかな画像に仕上げることが可能です。

#include <QApplication>
#include <QLabel>
#include <QPixmap>
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QLabel label;
    label.resize(500, 400);
    QPixmap pixmap("sample.png");
    // アスペクト比を保持し、滑らかな画像に変換しながらスケール
    label.setPixmap(pixmap.scaled(label.size(), Qt::KeepAspectRatio, Qt::SmoothTransformation));
    label.setWindowTitle("滑らか画像サンプル");
    label.show();
    return app.exec();
}
(ウィンドウ内に調整された画像が、滑らかな表示で描画される)

このアプローチを利用することで、グラフィカルな品質が求められるアプリケーションの画像表示に活かせます。

スタイルシートによる外観のカスタマイズ

テキストの色と背景色の設定

QLabelの見た目をさらに洗練させるには、スタイルシートを利用してテキストおよび背景の色の設定が可能です。

シンプルなコード例として、以下のサンプルが参考になります。

#include <QApplication>
#include <QLabel>
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QLabel label("色と背景のカスタマイズ");
    // テキストを青に、背景色を薄いグレーに設定
    label.setStyleSheet("color: blue; background-color: lightgray; padding: 10px;");
    label.show();
    return app.exec();
}
(ウィンドウに青い文字で「色と背景のカスタマイズ」が表示され、背景は薄いグレーで囲まれている)

この設定により、視覚的に魅力的なラベルの外観を簡単に作成できます。

複数プロパティの連携設定

複数のプロパティを同時に設定する場合、CSSのようにセミコロンで区切ることができ、柔軟にデザインを調整できます。

例として、フォントファミリー、サイズ、文字の太さも同時に設定するコードを示します。

#include <QApplication>
#include <QLabel>
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QLabel label("複数プロパティ設定");
    // フォント、文字色、背景色、余白(padding)を設定
    label.setStyleSheet("font-family: 'Arial'; font-size: 20px; font-weight: bold; color: white; background-color: #333333; padding: 8px;");
    label.show();
    return app.exec();
}
(ウィンドウに太いArialフォントの白い文字が、濃い背景の中で表示される)

このように複数のスタイルを組み合せることで、より魅力的なUIのデザインが実現できます。

背景画像とその他のスタイル調整

背景画像を設定することも、スタイルシートを利用すれば簡単に行えます。

テキスト背景の中に画像を入れることで、デザインに奥行きが生まれます。

例として、背景画像とテキストの影を設定するコードです。

#include <QApplication>
#include <QLabel>
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QLabel label("背景画像のサンプル");
    // 背景画像、文字の影、余白を設定
    label.setStyleSheet("color: white; \
                         background-image: url('background.jpg'); \
                         background-repeat: no-repeat; \
                         background-position: center; \
                         padding: 20px; \
                         text-shadow: 2px 2px 4px #000000;");
    label.resize(400, 300);
    label.show();
    return app.exec();
}
(ウィンドウに背景画像が中央に配置され、白い文字と軽い影がついたテキストが表示される)

この設定例は、視覚的に印象的な背景を簡単に作成する手法の一つです。

動的更新とイベント処理

信号とスロットによる動的コンテンツ更新

Qtの強力な特徴である信号とスロット機構を利用すれば、ユーザーの操作に応じた動的なコンテンツ更新が可能です。

たとえば、ボタンのクリックによってQLabelの内容を動的に変更する仕組みは、先ほど紹介したコードでも確認できます。

実用例として、定期的にテキストを更新するタイマーと連携した例を示します。

#include <QApplication>
#include <QLabel>
#include <QTimer>
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QLabel label("カウント: 0");
    label.setAlignment(Qt::AlignCenter);
    label.resize(300, 100);
    int count = 0;
    QTimer timer;
    QObject::connect(&timer, &QTimer::timeout, [&label, &count](){
        count++;
        label.setText(QString("カウント: %1").arg(count));
        label.adjustSize();
    });
    timer.start(1000); // 毎秒更新
    label.show();
    return app.exec();
}
(ウィンドウに「カウント: 0」と表示され、毎秒数値が更新される)

このようにタイマーとラベルを組み合わせれば、リアルタイムな情報更新が容易になります。

カスタムイベントハンドラの実装

標準のイベント処理だけでは対応しきれないシーンでは、カスタムイベントハンドラを実装し、特定の入力や動作に対して独自処理を追加することができます。

以下は、マウスクリックに反応して背景色を変更するサンプルです。

#include <QApplication>
#include <QLabel>
#include <QMouseEvent>
class ClickableLabel : public QLabel {
    Q_OBJECT
public:
    explicit ClickableLabel(const QString &text, QWidget *parent = nullptr) : QLabel(text, parent) {}
protected:
    void mousePressEvent(QMouseEvent *event) override
    {
        // クリックされるたびに背景色をトグル変更
        setStyleSheet("background-color: yellow;");
        // 基本処理も呼び出す場合は、以下のコメントアウトを外す
        // QLabel::mousePressEvent(event);
    }
};
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    ClickableLabel label("クリックして背景色変更");
    label.resize(350, 100);
    label.setAlignment(Qt::AlignCenter);
    label.show();
    return app.exec();
}
#include "main.moc"
(ウィンドウに表示されたテキストラベルをクリックすると、背景色が黄色に変わる)

このサンプルは、QLabelを継承して独自のイベントハンドリングを実装する方法が理解できる内容になっています。

簡単なカスタマイズで対話性を向上させることが可能です。

レイアウト連携とサイズ管理

レイアウトマネージャとの統合

QLabelを他のウィジェットと連携させる場合、レイアウトマネージャを利用するとウィンドウ全体の配置が自動的に管理されるので便利です。

以下は、QLabelをQVBoxLayoutで配置する簡単なサンプルです。

#include <QApplication>
#include <QLabel>
#include <QPushButton>
#include <QVBoxLayout>
#include <QWidget>
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QWidget window;
    QVBoxLayout layout(&window);
    QLabel label("ラベルの配置サンプル");
    QPushButton button("ボタンサンプル");
    layout.addWidget(&label);
    layout.addWidget(&button);
    window.setWindowTitle("レイアウト管理サンプル");
    window.show();
    return app.exec();
}
(ウィンドウにラベルとボタンが縦に配置され、レイアウトによりウィンドウのサイズ変更にも柔軟に対応)

この例は、レイアウトマネージャを利用してウィジェットの配置を自動管理する基本的な方法を示しています。

サイズプロパティ(minimumSize, maximumSize)の利用

ウィジェットの最小サイズや最大サイズを指定して、レイアウト内での表示を最適化することもできます。

サンプルでは、QLabelの最小サイズを設定する方法を紹介します。

#include <QApplication>
#include <QLabel>
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QLabel label("サイズ制限のサンプル");
    // 最小サイズを設定し、レイアウト内で縮小しすぎないようにする
    label.setMinimumSize(200, 50);
    label.setStyleSheet("background-color: #ccffcc;");
    label.show();
    return app.exec();
}
(ウィンドウのラベルに最小サイズが適用され、背景色が設定された状態で表示される)

この設定により、ユーザーの画面サイズが変わってもUIが崩れにくく実用的な配置が可能になります。

自動サイズ調整と配置最適化

自動サイズ調整機能を活用しつつ、ウィジェット間のスペース調整ができるレイアウト設定は、アプリケーション全体のデザイン向上に役立ちます。

たとえば、QLabelのadjustSizeを使い、他のウィジェットとのバランスを整えることで、見やすいUIを作ることができます。

以下は、ウィジェットのサイズ自体を動的に調整しながら配置を最適化するコード例です。

#include <QApplication>
#include <QLabel>
#include <QVBoxLayout>
#include <QWidget>
#include <QPushButton>
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QWidget window;
    QVBoxLayout layout(&window);
    QLabel label("自動サイズ調整テスト");
    label.setStyleSheet("border: 1px solid #000000; padding: 5px;");
    // 初回のサイズ調整
    label.adjustSize();
    QPushButton button("テキスト変更");
    layout.addWidget(&label);
    layout.addWidget(&button);
    QObject::connect(&button, &QPushButton::clicked, [&label](){
        // テキスト変更後に自動サイズ調整を呼び出す
        label.setText("テキストが更新されると、サイズも適切に調整される仕組みです。");
        label.adjustSize();
    });
    window.setWindowTitle("配置最適化サンプル");
    window.show();
    return app.exec();
}
(ウィンドウにラベルとボタンが表示され、ボタンを押すとラベルのテキストが変更されサイズが更新される)

上記のサンプルは、ウィジェット同士のレイアウトが動的に変化しても、見た目のバランスが崩れにくいUI設計の一例となっています。

拡張利用と応用例

カスタムQLabelの実装

継承による機能拡張

標準のQLabelに追加機能を実装する場合、QLabelを継承して独自に機能を拡張するアプローチが有効です。

例えば、クリック時に色を変えるカスタムラベルを作成するには、以下のようなコードが考えられます。

#include <QApplication>
#include <QLabel>
#include <QMouseEvent>
// CustomLabelクラスはQLabelを継承してクリックイベントをハンドリング
class CustomLabel : public QLabel {
    Q_OBJECT
public:
    explicit CustomLabel(const QString &text, QWidget *parent = nullptr) : QLabel(text, parent) {}
protected:
    void mousePressEvent(QMouseEvent *event) override
    {
        // クリックするたびに背景色が変化
        if (this->styleSheet().contains("background-color: lightblue"))
            setStyleSheet("background-color: none;");
        else
            setStyleSheet("background-color: lightblue;");
    }
};
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    CustomLabel label("クリックで背景色が変わります");
    label.setAlignment(Qt::AlignCenter);
    label.resize(400, 150);
    label.show();
    return app.exec();
}
#include "main.moc"
(ウィンドウに表示されたカスタムラベルをクリックすると、背景色が切り替わる)

このサンプルは、QLabelの基本機能に加え、継承を活用して独自の動作を追加する方法の一例です。

イベントオーバーライドの応用

さらに複雑なイベント処理が必要な場合は、他のイベントメソッドをオーバーライドして、ユーザーの入力に合わせたカスタムな動作を実装できます。

以下は、マウスのダブルクリックでテキストを変更するサンプルです。

#include <QApplication>
#include <QLabel>
#include <QMouseEvent>
class DoubleClickLabel : public QLabel {
    Q_OBJECT
public:
    explicit DoubleClickLabel(const QString &text, QWidget *parent = nullptr) : QLabel(text, parent) {}
protected:
    void mouseDoubleClickEvent(QMouseEvent *event) override
    {
        setText("ダブルクリックされました!");
        adjustSize();
    }
};
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    DoubleClickLabel label("ダブルクリックしてみてください");
    label.setAlignment(Qt::AlignCenter);
    label.resize(400, 150);
    label.show();
    return app.exec();
}
#include "main.moc"
(ウィンドウに表示されたラベルをダブルクリックすると、テキストが「ダブルクリックされました!」に変わる)

この実装は、ユーザーインターフェースの応答性を高め、よりインタラクティブな設計を実現するための参考になります。

パフォーマンス最適化の工夫

大容量画像の取り扱い

大きな画像ファイルを扱う場合、メモリの使用量に配慮しながら表示を制御する必要があります。

QPixmapを利用する際は、必要に応じて画像のサイズを縮小して読み込むことで、負荷を軽減することができます。

以下は、大容量画像のスケーリングを行いつつ表示する例です。

#include <QApplication>
#include <QLabel>
#include <QPixmap>
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QLabel label;
    label.resize(600, 400);
    QPixmap originalPixmap("large_image.png");
    // 大容量画像を表示領域に合わせて縮小
    QPixmap scaledPixmap = originalPixmap.scaled(label.size(), Qt::KeepAspectRatio, Qt::SmoothTransformation);
    label.setPixmap(scaledPixmap);
    label.setWindowTitle("大容量画像の処理サンプル");
    label.show();
    return app.exec();
}
(ウィンドウ内に大容量画像がスケーリングされ、アスペクト比を保持した形で表示される)

この方法は、特に多数の画像を扱うアプリケーションにおいて、パフォーマンスの最適化に寄与します。

再描画制御の手法

頻繁に再描画が行われると、パフォーマンスに影響が出やすいです。

必要に応じて、再描画を抑えるための工夫も考えられます。

例えば、QLabelの表示更新を一時的に停止し、変更が完了した後一気に反映するなどの手法が検討できます。

具体的な実装例は、アプリケーションの規模や要件に合わせて調整してください。

まとめ

今回の記事では、QLabelの基本的な機能からスタイルシートを利用したカスタマイズ、動的なコンテンツ更新やレイアウト連携、さらには拡張利用やパフォーマンス最適化について具体的なコード例を通して解説しました。

各サンプルを参考に、自分のプロジェクトに合った柔軟なUI作りを楽しんでもらえればうれしい。

関連記事

Back to top button
目次へ