スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Qtウィジエットの背景色の変更とレイアウトへの動的追加

いやはや、シロウトはこんな簡単なところでもはまれる。ハズいが忘れるといやなのでやっぱり書いておく。このサンプルは以下の二つの点を実現するものである。

1. QWidgetの背景色を変更する。
2. 順次QWidgetを生成しながら、レイアウトに追加して表示を更新していく。


#include "widgettest.h"
#include "ui_widgettest.h"
#include

WidgetTest::WidgetTest(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::WidgetTest)
{
ui->setupUi(this);
QLayout *layout = new QHBoxLayout;
ui->panelBase->setLayout(layout);

QWidget *panels[6];
QColor colors[6] = {Qt::red, Qt::blue, Qt::green, Qt::yellow, Qt::magenta, Qt::cyan};

for(int i = 0; i < 6; i++){
panels[i] = new QWidget(ui->panelBase);
QPalette palette = panels[i]->palette();
palette.setColor(QPalette::Window, colors[i]);
panels[i]->setPalette(palette);
panels[i]->setAutoFillBackground(true);
panels[i]->setMinimumSize(100, 100);
layout->addWidget(panels[i]);
panels[i]->show();
repaint();
sleep(1);
}
}


QtCreatorで作成したフォームはQtCreatorで作成したフォーム

のように極めて適当なもの。QMainWindowの上に、動的に生成して配置するウィジェットの親になるQWidget(panelBase)を一つ置いただけである。panelBaseには子ウィジェットが最初は何もないので、Designer画面ではpanelBase上にレイアウトを指定することができない。

そこで、ソース中では水平ボックスレイアウトを新規に作成して、これをpanelBaseに設定している。もしあらかじめDesigner画面の方で仮に子ウィジェットを一つ以上配置して、レイアウトを指定済みだと、後からレイアウトを追加することはできない。

各ウィジェットはデフォルトで親から引き継いだカラーパレット(QPalette)を持っており、パレット内では抽象的な役割(ColorRole)と、その役割に対する実際の色(QColor)のペアがいくつか登録されていて、実際に使用する場合は役割の方を指定して使うことになる。

ColorRoleの各enumの意味
ColorRoleのenum値説明
QPalette::Window一般的な背景色
QPalette::BackgroundObsolete。代わりにWindowを使用すべき。
QPalette::WindowText一般的なフォアグラウンドカラー
QPalette::ForegroundObsolete。代わりWindowTextを使うべき。
QPalette::Base主にテキスト入力ウィジェットの背景色として使われるが、コンボボックスの背景やツールバーハンドルの背景色としても使われる。通常は白か他の明るい色が使われる。
QPalette::AlternateBase表計算などで見られる、一行おきに背景色を変える場合に使われる第2の背景色。
QPalette::ToolTipBaseツールチップや、"What is this?"の表示の背景色に使われる。ツールチップの場合は、パレット自体が、inactive用のものが用いられる。
QPalette::ToolTipTextツールチップや、"What is this?"の表示の文字色に使われる。
以下は、GUIに3D効果を加えるため等に用いられる色。
QPalette::Buttonボタン用の背景色。スタイルによってはWindowとは異なる。
QPalette::ButtonTextボタン用の描画色。
QPalette::BrightTextボタンを押している間などに用いられる、WindowTextとははっきりと違い、かつDark等とははっきりコントラストの差がつく色。
QPalette::LightButtonよりは明るい色。
QPalette::MidlightButtonとLightの中間の明るさ。
QPalette::DarkButtonよりは暗い色。
QPalette::MidButtonとDarkの中間。
QPalette::Shadow非常に暗い色。デフォルトでは黒。
以下はテキスト表示に使用される色。
QPalette::Highlight現在選択されている項目を表す色。デフォルトではダークブルー。
QPalette::HighlightedTextハイライト表示されているテキストの色。HighLightとはっきりコントラストのある色。デフォルトでは白。
QPalette::Linkまだたどっていないハイパーリンク。デフォルトでは青。
QPalette::LinkVisitedすでにたどったハイパーリンク。デフォルトではマゼンタ。

 
 ということで、QWidgetの場合は、背景色を変えるということは、パレット中のWindowロールの色を変更すればよいことになる。このサンプルでは、まず各ウィジェットから現在のパレットを取得し、そのWindowロールの色だけをcolors[i]に変更して、そのパレットをウィジェットに設定し直している。

あとは、実は動的にウィジェットをレイアウトに追加といっても、最初にまとめて生成するのとほとんど違いはない。単に、一個ウィジェットを新しく追加するたびに、repaint()で表示を更新している。update()だと、描画リクエストが次回のイベント処理までバッファされてしまうので数個分まとめて表示されることになる。

表示されるウィンドウ
スポンサーサイト

コメントの投稿

非公開コメント

プロフィール

GM3D

Author:GM3D
FC2ブログへようこそ!

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
FC2カウンター
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。