Qt標準アイコン一覧

Qt 5.10に付属している標準アイコンの一覧を作成した。

Qtには付属しているアイコンがある。GUIアプリケーションのツールバーやダイアログなどにアイコンを表示したいときに利用できる。OSごとにどのようなアイコンが表示されるのか気になったので一覧を作成してみた。

アイコン一覧

まずはアイコン一覧を以下に掲載する。手元の環境の都合,Windows 7とUbuntu 16.04での表示アイコンを掲載した。

SP_DirLinkOpenIcon, SP_VistaShield, SP_CustomBaseはOSによっては表示されないようだ。個人的には,Androidでどのようなアイコンが表示されるのかが気になる。

Qt標準アイコン一覧
enum QStyle::StandardPixmap Windows 7 Ubuntu 16.04
SP_TitleBarMenuButton
SP_TitleBarMinButton
SP_TitleBarMaxButton
SP_TitleBarCloseButton
SP_TitleBarNormalButton
SP_TitleBarShadeButton
SP_TitleBarUnshadeButton
SP_TitleBarContextHelpButton
SP_DockWidgetCloseButton
SP_MessageBoxInformation
SP_MessageBoxWarning
SP_MessageBoxCritical
SP_MessageBoxQuestion
SP_DesktopIcon
SP_TrashIcon
SP_ComputerIcon
SP_DriveFDIcon
SP_DriveHDIcon
SP_DriveCDIcon
SP_DriveDVDIcon
SP_DriveNetIcon
SP_DirOpenIcon
SP_DirClosedIcon
SP_DirLinkIcon
SP_DirLinkOpenIcon

SP_FileIcon
SP_FileLinkIcon
SP_ToolBarHorizontalExtensionButton
SP_ToolBarVerticalExtensionButton
SP_FileDialogStart
SP_FileDialogEnd
SP_FileDialogToParent
SP_FileDialogNewFolder
SP_FileDialogDetailedView
SP_FileDialogInfoView
SP_FileDialogContentsView
SP_FileDialogListView
SP_FileDialogBack
SP_DirIcon
SP_DialogOkButton
SP_DialogCancelButton
SP_DialogHelpButton
SP_DialogOpenButton
SP_DialogSaveButton
SP_DialogCloseButton
SP_DialogApplyButton
SP_DialogResetButton
SP_DialogDiscardButton
SP_DialogYesButton
SP_DialogNoButton
SP_ArrowUp
SP_ArrowDown
SP_ArrowLeft
SP_ArrowRight
SP_ArrowBack
SP_ArrowForward
SP_DirHomeIcon
SP_CommandLink
SP_VistaShield
SP_BrowserReload
SP_BrowserStop
SP_MediaPlay
SP_MediaStop
SP_MediaPause
SP_MediaSkipForward
SP_MediaSkipBackward
SP_MediaSeekForward
SP_MediaSeekBackward
SP_MediaVolume
SP_MediaVolumeMuted
SP_LineEditClearButton
SP_CustomBase

ソースコード

Qt標準アイコン一覧を表示するために,以下のソースコードでプログラムを作成した。

QtExample/StandardIcon at master · senooken/QtExample

表示されるアイコン画像一覧をStandardIcon.htmlとStandardIcon.odtにも格納している。

コンパイルして生成されるStandardIcon(.exe)を実行すると,全Qt標準アイコンを表形式で表示する。

StandardIconの実行結果

この表はコピー可能であり,コピー後にLibreOffice Writer(5.1.6.2で確認)に貼り付けることができる(Word 2013は画像が貼り付けられなかった)。

今回のソースコードはそんなに文量がないので以下にも掲載する。

StandardIcon.pro
#-------------------------------------------------
#
# Project created by QtCreator 2018-02-14T23:14:45
#
#-------------------------------------------------

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = StandardIcon
TEMPLATE = app

# The following define makes your compiler emit warnings if you use
# any feature of Qt which has been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0


SOURCES += \
        main.cpp

HEADERS +=

FORMS +=

main.cpp
#include <QApplication>
#include <QtWidgets>
#include <QStyle>

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

    QTextBrowser editor;
    editor.show();

    auto metaEnum = QMetaEnum::fromType<QStyle::StandardPixmap>();
    auto cursor = editor.textCursor();
    auto table = cursor.insertTable(metaEnum.keyCount()+1, 2, QTextTableFormat());

    table->cellAt(0, 0).firstCursorPosition().insertText("enum QStyle::StandardPixmap");
    table->cellAt(0, 1).firstCursorPosition().insertText("Image");

    QTextBlockFormat format;
    format.setAlignment(Qt::AlignCenter);
    table->cellAt(0, 0).firstCursorPosition().setBlockFormat(format);
    table->cellAt(0, 1).firstCursorPosition().setBlockFormat(format);

    for (int icon_i = 0; icon_i < metaEnum.keyCount(); ++icon_i) {
        auto icon = QApplication::style()->standardPixmap(static_cast<QStyle::StandardPixmap>(icon_i));
        QBuffer buffer;
        icon.save(&buffer, "PNG");
        auto url = QString("<img src='data:image/png;base64,") + buffer.data().toBase64() + "'/>";
        table->cellAt(icon_i+1, 0).firstCursorPosition().insertText(metaEnum.key(icon_i));
        table->cellAt(icon_i+1, 1).firstCursorPosition().insertHtml(url);
        table->cellAt(icon_i+1, 1).firstCursorPosition().setBlockFormat(format);
        /// \warn Images inserted by insertImage are cannot copy to clipboard.
        // table->cellAt(icon_i+1, 1).firstCursorPosition().insertImage(QImage::fromData(buffer.data()));
    }

    return app.exec();
}

テクニック

Qt標準アイコンのリストを作るにあたって以下の3点の項目を工夫した。

  1. Qt標準アイコンへのアクセス
  2. enumの列挙
  3. 画像のコピー可能な形式での表示

1点目。Qt標準アイコンはenum QStyle::StandardPixmap型で定義されている。これにアクセスするには,QApplication::style()->standardPixmap();の引数にenumを指定すればいい。

2点目。基本的に(QSSを使う方法もある)Qt標準アイコンはenumでアクセスするしかない。そのため,何も考えない場合,全アイコンを取得するために全enumを列挙することになる。これはやり方として悪い。

何かいい方法がないか探していると,QtにはQMetaEnumクラスがあり,これを使うことで全enumへのアクセスや,enum名と値,インデックスによるアクセスなど,enumの柔軟な操作が可能になる。

c++ – Can you iterate over a each possible enum value using a Qt foreach loop? – Stack Overflow

3点目。Qt標準アイコンの表示はできるようになったが,今度はそれを他の文書でも使えるようにコピーペースト可能な形式で出力したい。いくつか方法があるようだが,今回はQStringにbase64で出力することにした。

qt – is there any way to insert QPixmap object in html? – Stack Overflow

実行時警告

こんな警告が表示されてしまう。

QFSFileEngine::open: No file name specified

これは28行目でbase64で画像を埋め込んでいるために発生している模様。

        auto url = QString("<img src='data:image/png;base64,") + buffer.data().toBase64() + "'/>";

base64で埋め込まずに,insertImageで埋め込めば警告は表示されないが,代わりにコピーペーストできない。

以下のフォーラムでも報告されているが,結局解決方法がわからないので放置する。

[QTBUG-43270] In QTextBrowser an embedded image <img src=”data:image/PNG;base64,…”> generates an error message “QFSFileEngine::open: No file name specified” – Qt Bug Tracker

まとめ

Qt標準アイコン一覧を作成した。アイコン一覧を表示するプログラムを作成したので,自分の環境でどのようなアイコンが表示されるのか,すぐに確認できるようにもした。

もし,MacやAndroid,FreeBSDなどその他の環境でのアイコン一覧を確認できたら,教えていただけたら一覧に追加する。GitHubのissueやコメント欄で気軽に教えてほしい。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です