QFont::underline()
具体的には以下の2つの使い方があります。
-
下線の設定 (setter)
void QFont::setUnderline(bool enable)
: この関数は、フォントに下線を引くかどうかを設定します。enable
がtrue
の場合、そのフォントで描画されるテキストには下線が引かれます。enable
がfalse
の場合、下線は引かれません(デフォルトの状態)。
QFont font; font.setUnderline(true); // フォントに下線を引く QLabel *label = new QLabel("このテキストには下線が引かれます"); label->setFont(font);
-
下線の状態の取得 (getter)
bool QFont::underline() const
この関数は、現在そのフォントに下線が設定されているかどうかを返します。- 下線が設定されていれば
true
を返します。 - 設定されていなければ
false
を返します。
使用例
QFont font; font.setUnderline(true); if (font.underline()) { qDebug() << "下線が設定されています。"; } else { qDebug() << "下線は設定されていません。"; }
- 下線が設定されていれば
注意点
- 下線のスタイル(点線、二重線など)を変更したい場合は、
QFont
クラスだけでは直接制御できません。 richerなテキスト表現が必要な場合は、QTextCharFormat
などを利用して、より詳細な書式設定を行う必要があります。
下線が表示されない、または期待通りに表示されない
エラー/現象
- 下線が文字に重なって表示される、または不自然な位置に表示される。
setFontUnderline(true)
を設定しても、テキストに下線が引かれない。
原因とトラブルシューティング
-
QPainterの使用方法
QPainter
で直接テキストを描画している場合、QPainter::setFont()
で適切に設定されたQFont
が渡されているか確認してください。- 対策
painter->setFont(myFont);
のように、QFont
オブジェクトがコピーされる形で渡されていることを確認します。ポインタ渡しなどで意図しない変更が行われている可能性があります。
-
スタイルシート (Qt Style Sheets) による上書き
- ウィジェットにスタイルシートを適用している場合、スタイルシートが
QFont
の設定を上書きしてしまうことがあります。 - 対策
スタイルシートでtext-decoration: underline;
のようなプロパティが設定されていないか確認してください。もし設定されている場合は、その設定がQFont::setUnderline()
よりも優先される可能性があります。
- ウィジェットにスタイルシートを適用している場合、スタイルシートが
-
QFont
オブジェクトを作成する際に、存在しないフォントファミリーを指定している場合があります。その場合、システムが代替フォントを使用するため、下線が期待通りに描画されないことがあります。- 対策
QFont::lastResortFamily()
やQFont::defaultFamily()
などを使って、実際に使用されているフォントを確認するか、QFontDatabase
を使ってシステムにインストールされているフォントをリストアップし、正しいフォントファミリー名を指定しているか確認してください。また、カスタムフォントを使用している場合は、QFontDatabase::addApplicationFont()
で正しく読み込まれているか確認が必要です。
QFont::underline()
やQFont::setUnderline()
を使用するとコンパイルエラーが発生する。
-
constオブジェクトに対するsetUnderline()の呼び出し
setUnderline()
はフォントの状態を変更するため、const
修飾されたQFont
オブジェクトに対しては呼び出すことができません。- 対策
const QFont myFont;
のようなconst
オブジェクトではないことを確認してください。
-
無効な引数、または関数のシグネチャの誤り
setUnderline()
にはbool
型の引数を渡す必要があります。他の型を渡すとコンパイルエラーになります。- 対策
font.setUnderline(true);
やfont.setUnderline(false);
のように、true
またはfalse
を渡しているか確認してください。
-
ヘッダーファイルの不足
QFont
クラスを使用するには、適切なヘッダーファイルを含める必要があります。- 対策
コードの冒頭に#include <QFont>
を含めているか確認してください。
- QML/Qt Quickでのフォント問題
- Qt WidgetsではなくQML/Qt Quickを使用している場合、フォントのレンダリングや下線の挙動は異なることがあります。QMLでは
Text
要素のtext-decoration
プロパティを使用します。 - 対策
QMLのドキュメントを参照し、QMLにおけるフォントとテキストの装飾方法を適切に適用しているか確認してください。
- Qt WidgetsではなくQML/Qt Quickを使用している場合、フォントのレンダリングや下線の挙動は異なることがあります。QMLでは
基本的な下線の設定と取得
この例では、QLabel
ウィジェットのテキストに下線を設定し、その状態を確認する方法を示します。
#include <QApplication>
#include <QLabel>
#include <QFont>
#include <QVBoxLayout>
#include <QWidget>
#include <QDebug> // デバッグ出力用
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
QWidget *window = new QWidget();
QVBoxLayout *layout = new QVBoxLayout(window);
// 1. QFontオブジェクトを作成
QFont font;
// 2. フォントサイズを設定(見やすくするため)
font.setPointSize(20);
// 3. 下線を設定(trueで下線を引く)
font.setUnderline(true);
// 4. QLabelを作成し、フォントを適用
QLabel *label1 = new QLabel("このテキストには下線が引かれます。");
label1->setFont(font);
layout->addWidget(label1);
// 5. 下線の状態を取得してデバッグ出力
qDebug() << "ラベル1の下線状態: " << font.underline(); // trueが出力されるはず
// 別のQLabelで下線なしのフォントを使用
QFont fontNoUnderline = font; // fontから設定をコピー
fontNoUnderline.setUnderline(false); // 下線を解除
QLabel *label2 = new QLabel("このテキストには下線がありません。");
label2->setFont(fontNoUnderline);
layout->addWidget(label2);
qDebug() << "ラベル2の下線状態: " << fontNoUnderline.underline(); // falseが出力されるはず
window->setWindowTitle("QFont::underline() の例");
window->show();
return app.exec();
}
解説
underline()
メソッドを使って、現在のフォントオブジェクトに下線が設定されているかどうかの状態を取得し、デバッグ出力で確認しています。QLabel
にそのフォントを適用することで、テキストに下線が引かれます。QFont
オブジェクトを作成し、setUnderline(true)
で下線を有効にしています。
QPushButton
のテキストにもQFont::underline()
を適用できます。
#include <QApplication>
#include <QPushButton>
#include <QFont>
#include <QVBoxLayout>
#include <QWidget>
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
QWidget *window = new QWidget();
QVBoxLayout *layout = new QVBoxLayout(window);
QPushButton *button = new QPushButton("下線付きのボタン");
QFont buttonFont = button->font(); // 現在のボタンのフォントを取得
buttonFont.setUnderline(true); // 下線を設定
buttonFont.setPointSize(15); // サイズも少し大きくする
button->setFont(buttonFont); // ボタンに新しいフォントを適用
layout->addWidget(button);
window->setWindowTitle("QPushButtonと下線");
window->show();
return app.exec();
}
解説
QPushButton
の既存のフォント設定を取得し、それに下線を追加して再設定しています。これにより、ボタンの他のフォント設定(フォントファミリー、太さなど)を維持しつつ、下線のみを追加できます。
QFont::underline()
はシンプルな下線に有効ですが、より複雑なテキスト編集(太字、斜体、色、異なる下線スタイルなど)を扱う場合は、QTextCharFormat
を使用することが一般的です。これはQFont::underline()
の直接的な使用例ではありませんが、関連する概念として重要です。
#include <QApplication>
#include <QTextEdit>
#include <QTextCharFormat>
#include <QFont>
#include <QVBoxLayout>
#include <QWidget>
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
QWidget *window = new QWidget();
QVBoxLayout *layout = new QVBoxLayout(window);
QTextEdit *textEdit = new QTextEdit();
textEdit->setPlainText("これは通常のテキストです。\n一部のテキストに下線を適用します。\n別のスタイルの下線も可能です。");
// テキストの一部に下線を適用
QTextCharFormat format;
format.setFontUnderline(true); // QFont::underline() と同様の機能
format.setUnderlineStyle(QTextCharFormat::SingleUnderline); // 単一の下線スタイル
// カーソルを移動してテキストを選択し、書式を適用
QTextCursor cursor = textEdit->textCursor();
cursor.movePosition(QTextCursor::StartOfLine); // 最初の行の先頭
cursor.movePosition(QTextCursor::Down, QTextCursor::MoveAnchor, 1); // 2行目に移動
cursor.movePosition(QTextCursor::EndOfLine, QTextCursor::KeepAnchor); // 2行目を選択
cursor.mergeCharFormat(format); // 選択範囲に書式を適用
// 別のスタイルの下線
QTextCharFormat dottedFormat;
dottedFormat.setFontUnderline(true);
dottedFormat.setUnderlineStyle(QTextCharFormat::DotLine); // 点線の下線
cursor = textEdit->textCursor();
cursor.movePosition(QTextCursor::StartOfLine);
cursor.movePosition(QTextCursor::Down, QTextCursor::MoveAnchor, 2); // 3行目に移動
cursor.movePosition(QTextCursor::EndOfLine, QTextCursor::KeepAnchor); // 3行目を選択
cursor.mergeCharFormat(dottedFormat);
layout->addWidget(textEdit);
window->setWindowTitle("QTextEditと下線");
window->show();
return app.exec();
}
QTextCharFormat::setFontUnderline(true)
はQFont::setUnderline(true)
と似た効果を持ちますが、setUnderlineStyle()
で下線の種類(単線、点線、破線など)をより詳細に制御できます。QTextEdit
のようなリッチテキストエディタでは、QTextCharFormat
を使用して個々の文字や文字列の書式を設定します。
Qtスタイルシート (Qt Style Sheets) の利用
Qtスタイルシートは、CSSのような構文でウィジェットの外観をカスタマイズするための強力なメカニズムです。テキストの下線もスタイルシートで制御できます。これは、アプリケーション全体または特定のウィジェットのスタイルを一元的に管理したい場合に非常に便利です。
方法
text-decoration
プロパティをunderline
に設定します。
コード例
#include <QApplication>
#include <QLabel>
#include <QPushButton>
#include <QVBoxLayout>
#include <QWidget>
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
QWidget *window = new QWidget();
QVBoxLayout *layout = new QVBoxLayout(window);
QLabel *label1 = new QLabel("スタイルシートで下線付きのラベル");
// QLabelに直接スタイルシートを適用
label1->setStyleSheet("text-decoration: underline; font-size: 20px;");
layout->addWidget(label1);
QPushButton *button1 = new QPushButton("スタイルシートで下線付きのボタン");
// QPushButtonにスタイルシートを適用
button1->setStyleSheet("text-decoration: underline; font-size: 15px;");
layout->addWidget(button1);
// 特定のオブジェクト名を持つウィジェットにスタイルシートを適用することも可能
QLabel *label2 = new QLabel("オブジェクト名で下線付きのラベル");
label2->setObjectName("underlinedLabel"); // オブジェクト名を設定
layout->addWidget(label2);
// アプリケーション全体にスタイルシートを適用
// (ここではオブジェクト名が"underlinedLabel"のQLabelに適用)
app.setStyleSheet("QLabel#underlinedLabel { text-decoration: underline; font-size: 18px; color: blue; }");
window->setWindowTitle("Qtスタイルシートによる下線");
window->show();
return app.exec();
}
メリット
- カスケード
親から子へ、より具体的な設定が優先されるCSSのカスケードの概念が適用されます。 - 分離
UIの見た目とロジックを分離できます。 - 柔軟性
アプリケーションのテーマ設定や動的なスタイルの変更に非常に適しています。
デメリット
- 細かい制御の限界
text-decoration
プロパティでは、下線のスタイル(点線、二重線など)は制御できません。 - 学習曲線
CSSの知識が必要です。 - オーバーヘッド
非常に多くのウィジェットに複雑なスタイルシートを適用すると、パフォーマンスに影響を与える可能性があります(ただし、通常は無視できるレベル)。
リッチテキスト/HTMLタグの利用 (特に QTextEdit, QTextBrowser, QLabelの一部)
QTextEdit
やQTextBrowser
などのリッチテキストを扱うウィジェット、また、HTML形式のテキストを表示できるQLabel
では、テキスト自体にHTMLタグを埋め込むことで下線を表示できます。
HTMLの<u>
タグ(underline)を使用します。
#include <QApplication>
#include <QTextEdit>
#include <QLabel>
#include <QVBoxLayout>
#include <QWidget>
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
QWidget *window = new QWidget();
QVBoxLayout *layout = new QVBoxLayout(window);
// QTextEditでのHTML利用
QTextEdit *textEdit = new QTextEdit();
textEdit->setHtml("これは<u>HTMLタグで下線が引かれた</u>テキストです。<br>"
"<b>太字</b>や<i>斜体</i>と組み合わせることもできます。");
layout->addWidget(textEdit);
// QLabelでのHTML利用(setTextFormat(Qt::RichText)が必要な場合あり、
// またはデフォルトでRichText対応している場合)
QLabel *label = new QLabel();
label->setTextFormat(Qt::RichText); // QLabelでHTMLを解釈させる
label->setText("<u>HTMLタグで下線付きのラベル</u>");
layout->addWidget(label);
window->setWindowTitle("HTMLタグによる下線");
window->show();
return app.exec();
}
- 簡単
HTMLの知識があれば簡単に実装できます。 - 柔軟性
テキストの特定の部分にのみ下線を適用したり、他のHTMLタグと組み合わせて複雑なテキスト表現を行ったりできます。
- QTextCharFormatより劣る制御
QTextCharFormat
(後述)と比較すると、下線のスタイルなどをプログラム的に細かく制御するのは難しいです。 - QTextEdit/QTextBrowser以外での利用
QLabel
でHTMLを使用する場合、setTextFormat(Qt::RichText)
を明示的に設定する必要がある場合があります。また、すべてのウィジェットがHTMLを解釈できるわけではありません。 - セキュリティ
信頼できないHTMLを入力として受け入れる場合、XSSなどのセキュリティリスクが発生する可能性があります(通常はユーザーからの入力をそのまま表示しない限り問題ありません)。
これはQFont::underline()
と機能的には似ていますが、QTextEdit
やQTextBrowser
などのリッチテキストを扱うウィジェットで、テキストの一部にプログラム的に書式設定を適用する際に使用されるより高レベルなAPIです。QFont
はフォント全体の属性を管理するのに対し、QTextCharFormat
は文字レベルでの詳細な書式(下線スタイル、背景色、文字色など)を管理します。
QTextCharFormat
オブジェクトを作成し、setFontUnderline(true)
およびsetUnderlineStyle()
で下線のスタイルを設定し、これをQTextCursor
を使ってテキストに適用します。
#include <QApplication>
#include <QTextEdit>
#include <QTextCharFormat>
#include <QTextCursor>
#include <QVBoxLayout>
#include <QWidget>
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
QWidget *window = new QWidget();
QVBoxLayout *layout = new QVBoxLayout(window);
QTextEdit *textEdit = new QTextEdit();
textEdit->setPlainText("このテキストの一部に、プログラムで下線を適用します。\n"
"異なる下線スタイル(点線など)も試してみましょう。");
// 最初の行の一部に単一の下線を適用
QTextCharFormat singleUnderlineFormat;
singleUnderlineFormat.setFontUnderline(true);
singleUnderlineFormat.setUnderlineStyle(QTextCharFormat::SingleUnderline); // 単一の下線
QTextCursor cursor = textEdit->textCursor();
cursor.movePosition(QTextCursor::Start); // テキストの先頭に移動
cursor.movePosition(QTextCursor::Right, QTextCursor::MoveAnchor, 13); // "このテキストの"
cursor.movePosition(QTextCursor::Right, QTextCursor::KeepAnchor, 4); // "一部"を選択
cursor.mergeCharFormat(singleUnderlineFormat); // 書式を適用
// 2行目のテキストに点線の下線を適用
QTextCharFormat dottedUnderlineFormat;
dottedUnderlineFormat.setFontUnderline(true);
dottedUnderlineFormat.setUnderlineStyle(QTextCharFormat::DotLine); // 点線の下線
dottedUnderlineFormat.setFontWeight(QFont::Bold); // 下線と一緒に太字も適用
cursor = textEdit->textCursor(); // カーソルをリセット
cursor.movePosition(QTextCursor::StartOfLine); // 最初の行の先頭
cursor.movePosition(QTextCursor::Down, QTextCursor::MoveAnchor, 1); // 2行目に移動
cursor.movePosition(QTextCursor::EndOfLine, QTextCursor::KeepAnchor); // 2行目全体を選択
cursor.mergeCharFormat(dottedUnderlineFormat);
layout->addWidget(textEdit);
window->setWindowTitle("QTextCharFormatによる下線");
window->show();
return app.exec();
}
- リッチテキスト対応
QTextEdit
などのリッチテキストウィジェットで、ユーザーインターフェースを介さずにテキストを装飾するのに最適です。 - 詳細な制御
下線のスタイル(点線、破線、二重線など)、色、太さなど、非常に詳細なテキスト書式をプログラム的に制御できます。
- ウィジェットの限定
主にQTextEdit
やQTextBrowser
などのリッチテキスト表示/編集ウィジェットでの使用を意図しています。 - 複雑さ
QTextCursor
を操作する必要があるため、単純な下線設定よりもコードが複雑になります。
- QTextCharFormat
QTextEdit
などで、テキストの一部に非常に詳細な書式(下線スタイル、色など)をプログラム的に適用したい場合に最適です。 - HTMLタグ
QTextEdit
やQLabel
などで、簡易的なリッチテキスト表現が必要な場合に手軽です。 - Qtスタイルシート
アプリケーションのルック&フィールを一元的に管理したい場合や、デザインとコードを分離したい場合に強力な選択肢です。 - QFont::underline()
最もシンプルで基本的な方法。ウィジェット全体のテキストに一律に下線を適用したい場合に適しています。