【QScrolArea】中身のサイズに応じてスクロールバーを表示する
QScrollArea はスクロールバーを表示するウィジェットです。
スクロールバーは内包するウィジェットのサイズを受けて設定されます。
他のツールでも同様ですが、意味のあるスクロールバーを表示するにはコツがいります。
もし QScrollArea を見て、「これで手軽にスクロールバー表示できるぜ!ヒャッホーイ!」
と特に設定せずウィジェットやアイテムのサイズを動的に変化した場合、
意図したスクロールバーの表示はされません。
(アイテムが潰れた表示になるかもしれません。)
この問題に対処するには、まず QScrollArea に対して以下の設定をします。
widgetResizable:true
加えて、QScrollArea直下の内包ウィジェット(ContentWidget)のレイアウトに
以下の設定をします。
layoutSizeConstraint:SetMinimumSize
1つ目の設定で、ウィジェットのサイズ変更をQScrollAreaに容認させ、
2つ目の設定で、ContentWidgetのサイズをそれの持つアイテムによって変化するものとします。
これにより、QScrollAreaは中身のサイズの変化したことを受け取り、
スクロールバーが表示されるようになります。
参考
モバイルフレンドリー についてメモ
先日 Googleが検索結果アルゴリズムを新しくしました。
この変更で、モバイル端末ではモバイルフレンドリーなウェブページが、
優先して表示されるとのことです。
モバイルフレンドリー という単語を聞いたこともなかったので、
調べたことをつらつら書いていこうと思います。
モバイルフレンドリーとは
モバイルフレンドリーについては以下で概要が説明されています。
Google基準のモバイルフレンドリーに合致してるかどうかも判定できるようです。
簡単に確認できるのは便利ですね。
モバイルフレンドリーにするには
モバイルフレンドリー にする手法は以下の3つがあるとのことです。
- レスポンシブ ウェブ デザイン
- 動的な配信
- 別々の URL
レスポンシブ ウェブ デザイン
デバイスの画面サイズに応じて、表示を変える手法です。
cssの振り分けにより実装できるので、変更は小さく抑えらます。
小規模なサイトではこの手法を取るのが良さそうです。
動的な配信
デバイスの種類に応じて、ページを動的に表示する手法です。
ページを動的に生成するので、URLは1つで済みます。
動的なページの表示は、Java や PHP などを用いて
ユーザーエージェントに応じてページを生成することで実装できます。
柔軟な対応が取れるので、中規模以上のサイトなら
将来的にもこちらの対応もよいかと思われます。
別々の URL
デバイスの種類に応じて、ページのURLを変える手法です。
独立性が高いため、デバイスに特化した表示ができます。
デバイスごとにページを用意する必要が有るため、
大規模化に耐えられるならば選択肢に挙がります。
【Qt】【QListView】QListViewの選択項目の取得
QListViewの選択項目の取得には以下の2通りの方法があります。
- フォーカス中のアイテムの取得
- 選択状態のアイテムの取得
まずはそれぞれの方法を示します。
- フォーカス中のアイテムの取得
QStandardItem * item = NULL; // フォーカス中のアイテムのインデックスを取得 const QModelIndex index = listView->selectionModel()->currentIndex(); item = model->itemFromIndex(index); Q_ASSERT(item);
- 選択状態のアイテムの取得
QStandardItem * item = NULL; QList<QStandardItem *> listItem; // 選択項目のインデックスリスト(選択順) QModelIndexList listIndex = listView->selectionModel()->selectedIndexes(); foreach ( QModelIndex index, listIndex ) { item = model->itemFromIndex( index ); Q_ASSERT(item); listItem << item; }
見ていただければわかるように、この2つの方法には以下の違いがあります。
- フォーカス中の項目の取得は1つのアイテムインデックスが得られる
- 選択中の項目の取得は複数のアイテムインデックスが得られる
設定をしない限りは同時に選択できる項目が1つのみのため、
得られる結果に違いはありません。
ただし、複数選択を可能とした場合には、
後者の方法が見かけの選択項目と同じ項目を返します。
複数選択は、以下の設定をすることで可能となります。
// 選択モードを複数選択に設定
listView->setSelectionMode( QAbstractItemView::ExtendedSelection );
参考
【Qt】【QListView】QListViewの項目の追加
QListView に項目の追加する方法を示します。
まずは、前準備として以下のようにモデルの設定します。
// リストビュー QListView *listView; listView = new QListView(); Q_CHECK_PTR(listView); // 表示モデルを用意 QStandardItemModel * model = new QStandardItemModel(); // モデルの設定 listView->setModel(model);
この ListView にテキストの項目を追加する場合、 以下のようにモデルの参照を取得して追加します。
// 追加アイテムのテキストリスト QStringList listItemText; listItemText << "murmur"; listItemText << "chant"; listItemText << "pray"; listItemText << "invoke!"; // 設定モデルの取得 QStandardItemModel * model = qobject_cast<QStandardItemModel*>(listView->model()); // テキストアイテムの追加 QStandardItem * item = NULL; foreach ( QString text, listItemtext ) { item = new QStandardItem(); Q_CHECK_PTR(item); item->setText( text ); item->setEditable( false ); model->appendRow( item ); // リストビューはアイテムを列に追加 }
【VBA】ワークシートを巡回する
ブックの全てのワークシートは Worksheets で呼ぶことができます。
この複数のワークシートに対して特定の操作をするために、
VBAの繰り返しステートメントの一つ For Each を用います。
For Each ws In Worksheets ' ワークシートの名前をデバッグプリント Debug.Print wsMain.Name Next ws
ただし、C++などにある次のループまで処理をスキップする Continue 文は存在しません。 そのため、処理のスキップには GoTo 文を使います。
For Each ws In Worksheets ' ワークシート main はスキップ If wsMain.Name = "main" Then GoTo Continue End If ' ワークシートの名前をデバッグプリント Debug.Print wsMain.Name Continue: ' GoTo でここまでスキップされる Next ws