Qt標準アイコン一覧
Qt 5.10に付属している標準アイコンの一覧を作成した。
Qtには付属しているアイコンがある。GUIアプリケーションのツールバーやダイアログなどにアイコンを表示したいときに利用できる。OSごとにどのようなアイコンが表示されるのか気になったので一覧を作成してみた。
アイコン一覧
まずはアイコン一覧を以下に掲載する。手元の環境の都合,Windows 7とUbuntu 16.04での表示アイコンを掲載した。
SP_DirLinkOpenIcon, SP_VistaShield, SP_CustomBaseはOSによっては表示されないようだ。個人的には,Androidでどのようなアイコンが表示されるのかが気になる。
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標準アイコン一覧を表示するために,以下のソースコードでプログラムを作成した。
表示されるアイコン画像一覧をStandardIcon.htmlとStandardIcon.odtにも格納している。
コンパイルして生成されるStandardIcon(.exe)を実行すると,全Qt標準アイコンを表形式で表示する。
この表はコピー可能であり,コピー後にLibreOffice Writer(5.1.6.2で確認)に貼り付けることができる(Word 2013は画像が貼り付けられなかった)。
今回のソースコードはそんなに文量がないので以下にも掲載する。
#-------------------------------------------------
#
# 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 +=
#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点の項目を工夫した。
- Qt標準アイコンへのアクセス
- enumの列挙
- 画像のコピー可能な形式での表示
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で埋め込めば警告は表示されないが,代わりにコピーペーストできない。
以下のフォーラムでも報告されているが,結局解決方法がわからないので放置する。
まとめ
Qt標準アイコン一覧を作成した。アイコン一覧を表示するプログラムを作成したので,自分の環境でどのようなアイコンが表示されるのか,すぐに確認できるようにもした。
もし,MacやAndroid,FreeBSDなどその他の環境でのアイコン一覧を確認できたら,教えていただけたら一覧に追加する。GitHubのissueやコメント欄で気軽に教えてほしい。