「Qtのコントロール - ラベル」の版間の差分

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動
1行目: 1行目:
== 概要 ==
== 概要 ==
Qtにおいて、QLabelクラスを使用してラベルをコントロールする手順を記載する。<br>
Qtにおいて、<code>QLabel</code>クラスを使用してラベルをコントロールする手順を記載する。<br>
<br><br>
 
== テキストの折り返し ==
ラベルの横幅に合わせて文字列を分割して、改行コードを入れた文字列を返す。<br>
<code>QLabel</code>クラスの<code>wordWrap</code>メソッドも存在する。<br>
<br>
これは、ラベルの横幅が固定されている場合、長い文字列を表示する時に使用する。<br>
もし、文字列がラベルの横幅に収まる場合、分割・改行せずに文字列を返す。<br>
<br>
<u>※注意</u><br>
<u>フォントの設定を行っていない場合、サイズを正しく計算できないことがある。</u><br>
<syntaxhighlight lang="c++">
QString MainWindow::wrapLabelText(QLabel *label, QString text)
{
    int mxWidth = label->width();
    QFontMetrics fm(label->fontMetrics());
    if(fm.width(text) <= mxWidth)
    {
      return text;
    }
    QString tmpStr  = "";
    QString lineStr = "";
    for(int i = 0; i < text.length(); i++)
    {
      QString str = text.mid(i, 1);
      if(str == "\n")
      {
          tmpStr += lineStr + "\n";
          lineStr = "";
          continue;
      }
      if((fm.width(lineStr) + fm.width(str)) >= mxWidth)
      {
          tmpStr += lineStr + "\n";
          lineStr = "";
      }
      lineStr += str;
    }
    tmpStr += lineStr;
    return tmpStr;
}
</syntaxhighlight>
<br><br>
<br><br>



2021年3月10日 (水) 21:29時点における版

概要

Qtにおいて、QLabelクラスを使用してラベルをコントロールする手順を記載する。


テキストの折り返し

ラベルの横幅に合わせて文字列を分割して、改行コードを入れた文字列を返す。
QLabelクラスのwordWrapメソッドも存在する。

これは、ラベルの横幅が固定されている場合、長い文字列を表示する時に使用する。
もし、文字列がラベルの横幅に収まる場合、分割・改行せずに文字列を返す。

※注意
フォントの設定を行っていない場合、サイズを正しく計算できないことがある。

 QString MainWindow::wrapLabelText(QLabel *label, QString text)
 {
    int mxWidth = label->width();
    QFontMetrics fm(label->fontMetrics());
    if(fm.width(text) <= mxWidth)
    {
       return text;
    }
 
    QString tmpStr  = "";
    QString lineStr = "";
 
    for(int i = 0; i < text.length(); i++)
    {
       QString str = text.mid(i, 1);
       if(str == "\n")
       {
          tmpStr += lineStr + "\n";
          lineStr = "";
          continue;
       }
 
       if((fm.width(lineStr) + fm.width(str)) >= mxWidth)
       {
          tmpStr += lineStr + "\n";
          lineStr = "";
       }
 
       lineStr += str;
    }
 
    tmpStr += lineStr;
 
    return tmpStr;
 }



ハイパーリンク

ラベルのテキストをハイパーリンクとして表示するには、
Qt Designerでラベルのプロパティを、以下のように設定する。

  • textプロパティ
    <a href="URL">表示するテキスト</a>
  • textFormatプロパティ
    AutoText
  • openExternalLinksプロパティ
    チェックを入力する。
  • textInteractionFlagsプロパティ
    LinksAccessibleByMouse



クリック可能なQLabel

QLabelクラスは、リンクの選択時やホバー時にシグナルを送信するが、押下時はシグナルを送信しない。

以下の例では、QLabelクラスを継承したサブクラスを作成して、
QLabelクラスのmousePressEventメソッドをオーバーライドすることにより、ラベル押下時にシグナルを送信している。

 // QClickableLabel.h
 
 class QClickableLabel : public QLabel
 {
 Q_OBJECT
 
 public:
    explicit ClickableLabel(const QString &text="", QWidget* parent=0);
    virtual ~ClickableLabel();
 
 signals:
    void clicked();
 
 protected:
    void mousePressEvent(QMouseEvent* event);
 };


 // QClickableLabel.cpp
 
 ClickableLabel::ClickableLabel(const QString &text, QWidget* parent) : QLabel(text, parent)
 {
 }
 
 void ClickableLabel::mousePressEvent(QMouseEvent* event)
 {
    emit clicked();
 }
 
 ClickableLabel::~ClickableLabel()
 {
 }



画像の表示

以下の例では、ラベルに画像を埋め込んでいる。

mainwindow.uiファイルにLabelコントロールを配置している。
また、画像を表示するために、QPixmpをインクルードする必要がある。

 // mainwindow.cpp
 
 #include "mainwindow.h"
 #include "ui_mainwindow.h"
 #include <QPixmap>
 
 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
 {
    ui->setupUi(this);
 
    QPixmap pix("<画像ファイルのパス>");
    ui->label->setPixmap(pix);
 }
 
 MainWindow::~MainWindow()
 {
    delete ui;
 }


また、Labelコントロールに埋め込む画像を拡大表示するには、以下のように記述する。

 // 変更前
 ui->label->setPixmap(pix);
 
 // 変更後
 ui->label->setPixmap(pix.scaled(<横のピクセル>, <縦のピクセル>));