Qt GUI:ハイパーリンククリックでブラウザを開く!QPalette::link()とQTextBrowserの連携技


QPalette::link()は、Qt GUIにおけるハイパーリンクのテキストカラーを設定するための関数です。この関数は、未訪問のハイパーリンクと既訪問のハイパーリンクそれぞれに対して異なるテキストカラーを設定することができます。

デフォルトカラー

デフォルトでは、未訪問のハイパーリンクは青色、既訪問のハイパーリンクはマゼンタ色で表示されます。

使用方法

QPalette::link()関数は、以下の2つの方法で使用することができます。

  • QPaletteオブジェクトを渡す
    QPalette palette;
    palette.setColor(QPalette::Link, Qt::red);
    palette.setColor(QPalette::LinkVisited, Qt::blue);
    widget->setPalette(palette);
    
  • ColorRole引数を使用する
    QPalette palette;
    palette.setColor(QPalette::Link, Qt::red); // 未訪問のハイパーリンクを赤色に設定
    palette.setColor(QPalette::LinkVisited, Qt::blue); // 既訪問のハイパーリンクを青色に設定
    widget->setPalette(palette); // ウィジェットにパレットを適用
    

スタイルシートの使用

QPalette::link()関数以外にも、スタイルシートを使用してハイパーリンクのテキストカラーを設定することができます。スタイルシートを使用する場合は、以下のプロパティを使用します。

  • a:visited { color: blue; } // 既訪問のハイパーリンクを青色に設定
  • a:link { color: red; } // 未訪問のハイパーリンクを赤色に設定

以下の例は、ラベルにハイパーリンクを含むテキストを設定し、QPalette::link()関数を使用してテキストカラーを変更する方法を示しています。

QLabel label(this);
label.setText("<a href=\"https://www.qt.io\">Qt Project</a>");

QPalette palette;
palette.setColor(QPalette::Link, Qt::red);
palette.setColor(QPalette::LinkVisited, Qt::blue);
label->setPalette(palette);

この例では、"Qt Project"というテキストがハイパーリンクとして表示され、未訪問の場合は赤色、既訪問の場合は青色で表示されます。

  • スタイルシートを使用する場合は、QPalette::link()関数よりも柔軟な設定が可能になります。
  • QPalette::link()関数は、ウィジェットに適用されたパレットの色のみを変更します。グローバルなハイパーリンクのテキストカラーを変更するには、QApplication::palette()関数を使用してグローバルパレットを取得し、その上でQPalette::link()関数を呼び出す必要があります。


main.cpp

#include <QApplication>
#include <QLabel>
#include <QPalette>

int main(int argc, char *argv[]) {
  QApplication app(argc, argv);

  // ラベルの作成
  QLabel label;
  label.setText("<a href=\"https://www.qt.io\">Qt Project</a>");

  // パレットの作成
  QPalette palette;
  palette.setColor(QPalette::Link, Qt::red); // 未訪問のハイパーリンクを赤色に設定
  palette.setColor(QPalette::LinkVisited, Qt::blue); // 既訪問のハイパーリンクを青色に設定

  // ラベルにパレットを適用
  label.setPalette(palette);

  // ラベルの表示
  label.show();

  return app.exec();
}

このコードの説明

  1. QApplicationオブジェクトを作成します。
  2. QLabelオブジェクトを作成し、ハイパーリンクを含むテキストを設定します。
  3. QPaletteオブジェクトを作成します。
  4. QPalette::setColor()関数を使用して、未訪問のハイパーリンクと既訪問のハイパーリンクのテキストカラーを設定します。
  5. QLabel::setPalette()関数を使用して、ラベルにパレットを適用します。
  6. QLabel::show()関数を使用して、ラベルを表示します。

実行結果

このコードを実行すると、以下のようになります。

  • "Qt Project" はハイパーリンクとして表示され、未訪問の場合は赤色、既訪問の場合は青色で表示されます。
  • ラベルに "Qt Project" というテキストが表示されます。


スタイルシートの使用

スタイルシートを使用すると、より柔軟にハイパーリンクのスタイルを設定することができます。QPalette::link()関数よりも詳細な制御が可能であり、コードも簡潔になります。

例:

a:link {
  color: red;
  text-decoration: none;
}

a:visited {
  color: blue;
  text-decoration: none;
}

このスタイルシートは、未訪問のハイパーリンクを赤色で、既訪問のハイパーリンクを青色で表示します。text-decoration: none; を使用して、下線を非表示にすることもできます。

QTextDocument::setLinkCursor()の使用

QTextDocument::setLinkCursor()関数は、ハイパーリンクにカーソルを合わせたときに表示されるカーソルのスタイルを設定することができます。この関数は、テキストエディタなどのウィジェットで使用することができます。

QTextDocument document;
document.setHtml("<a href=\"https://www.qt.io\">Qt Project</a>");

QTextCursor cursor(&document);
cursor.setPosition(0, QTextCursor::MoveAnchor);
cursor.setPosition(document.lastBlock().position(), QTextCursor::MoveAnchor);
cursor.setLinkCursor(Qt::CrossCursor);

このコードは、ハイパーリンクにカーソルを合わせたときに、十字カーソルを表示します。

QTextBrowser::setOpenExternalLinks()の使用

QTextBrowser::setOpenExternalLinks()関数は、ハイパーリンクをクリックしたときに自動的にブラウザを開くように設定することができます。この関数は、Webブラウザのようなウィジェットで使用することができます。

QTextBrowser browser;
browser.setOpenExternalLinks(true);
browser.setHtml("<a href=\"https://www.qt.io\">Qt Project</a>");

このコードは、"Qt Project" というハイパーリンクをクリックすると、ブラウザが開いて にアクセスするように設定します。

カスタムロジックの使用

上記の代替方法がすべて適用できない場合は、カスタムロジックを使用してハイパーリンクのテキストカラーを設定することができます。この方法は、より複雑な要件を満たす場合に役立ちますが、コード量が増え、保守が難しくなる可能性があります。