retireSakiの日記

たぶん引退した?ソフトウエアエンジニアのブログ

QFileDialog に関するテクニック (2)

QFileDialog に関するテクニック (2)

今回はQt(C++)のQFileDialogに関するテクニック(2) です。

使用するOSは、Ubuntu 18.04 LTS, Qt 5.9.5, x86_64-linux-gnu-g++-8 です。

前回、Qtの標準ダイアログのサイズを拡張する方法を紹介しましたが、今回はヘッダー情報も保存・再現させるテクニックをご紹介します。

 

1.前回のコードで表示されるダイアログはこんな感じです。

表示されるダイアログ

f:id:retireSaki:20180922152538j:plain

QFileDialog 横幅を拡張


使用したコード:

QFileDialog dlgfile(this);
dlgfile.setOptions(QFileDialog::ReadOnly|QFileDialog::DontUseNativeDialog);
dlgfile.setWindowTitle(tr("test"));
dlgfile.setDirectory(QStandardPaths::writableLocation(QStandardPaths::HomeLocation));
dlgfile.setNameFilter(tr("All (*.*)"));

QSize size=dlgfile.size();
dlgfile.resize(820,size.height());

dlgfile.exec();

 

2.今回は saveState(), restoreState() を使って、ユーザーが最終的に設定した状態を再現します。
つまり、ヘッダーの幅・各カラムの幅・カラムのソート状態を再現させることができますので、前回のテクニックと合わせることで、ほぼ完璧と言えるでしょう。


表示されるダイアログ

f:id:retireSaki:20180923113029j:plain

QFileDialog 横幅・ヘッダーを拡張


使用したコード:

QFileDialog dlgfile(this);
dlgfile.setOptions(QFileDialog::ReadOnly|QFileDialog::DontUseNativeDialog);
dlgfile.setWindowTitle(tr("test"));
dlgfile.setDirectory(QStandardPaths::writableLocation(QStandardPaths::HomeLocation));
dlgfile.setNameFilter(tr("All (*.*)"));

QSize size=dlgfile.size();
dlgfile.resize(820,size.height());

QSettings settings(QSettings::UserScope,"test","test");
settings.beginGroup("filedialog");
QByteArray dlgstate=settings.value("state").toByteArray();
settings.endGroup();
dlgfile.restoreState(dlgstate);

dlgfile.exec();

settings.beginGroup("filedialog");
settings.setValue("state",dlgfile.saveState());
settings.endGroup();

 

今回は、超かんたんに使える QSettings を使っています。

本来、サイドバーのアイコンをオリジナルに変更したいところです。
これを触るとなると、QFileIconProviderを実装し、これがとてつもなく厄介者なので諦めました(笑)

 

たったこれだけの変更でも、Qtのファイルダイアログでもかなり使いやすくなりますね。

 

注目記事

「Amazon.co.jpアソシエイト」または「[乙の名称を挿入]は、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイトプログラムである、Amazonアソシエイト・プログラムの参加者です。