WPFのデータ・バインディングの基礎学習 [C#][WPF]
WPFのデータバインディングを勉強していきます。
開発環境は、Microsoft Visual Studio Community 2015を使用します。
WPFでは、データ・ソース(=モデルなどの、データの提供元)をビュー(=WPFの場合はXAMLコード)上のUI要素と簡単に結び付けるために、データ・バインディングという仕組みを提供しています。
サンプルプロジェクトでは、バインディング要素は以下のような関係になっています。
項目 | 意味 | サンプルでの対象 |
---|---|---|
バインディングソース | データの提供元のオブジェクト | Slider Control |
ソース・プロパティ | データ提供元となる、バインディング・ソースのプロパティ | Slider .Value |
バインディングターゲット | データの反映先のオブジェクト | Label Control |
ターゲットプロパティ | データの反映咲となる、バインディング・ターゲットのプロパティ | Labal Content |
<サンプルプロジェクト> プロジェクトは、WPFプロジェクトを選択してください。
<サンプルプロジェクト(ModeプロパティがOneWayのとき)>
<Window x:Class="WPF_TEST.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:WPF_TEST" mc:Ignorable="d" Title="MainWindow" Height="350" Width="525"> <StackPanel> <Slider x:Name="SampleSlider"> </Slider> <Label Content="{Binding ElementName=SampleSlider, Path=Value}"></Label> </StackPanel> </Window>
<サンプルプロジェクト(ModeプロパティがTwoWayのとき> UpdateSourceTriggerプロパティがPropertyChangedになっているのに注意してください
<Window x:Class="WpfApplication2.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:WpfApplication2" mc:Ignorable="d" Title="MainWindow" Height="350" Width="525"> <StackPanel> <Slider x:Name="SampleSlider"/> <TextBox Text="{Binding ElementName=SampleSlider, Path=Value, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> </StackPanel> </Window>
<参考ページ> www.atmarkit.co.jp
C++11 文法について [C++]
以下のページに詳しく書いてあります。
- 範囲for文
- 型推論
- ラムダ式
- 型alias
- typedef ⇒ usingを使おう
- typedefはオワコン
- 新初期化記法
- リストイニシャライザ
- override
Qt Creatorを用いた自動deploy方法 (Windows 編) [Qt]
Qtアプリを配布する場合は、実行ファイル(*.exe)ファイルのみでは実行できません。
アプリで使用しているDLLファイルがないためです。
そこで、DLLファイルをいざ集めようとするとこんなに大量にDLLファイルが必要になります。 <一例>
そこで、windeployqtを用いて、Qt Creator上で、自動で、DLLファイルを集める方法を用いました。
以下がQt Creatorのプロジェクトのビルド設定です。
コマンド : C:\Qt\5.9.1\tool\deploy.bat
引数 : %{CurrentBuild:Name} %{CurrentProject:Name}
作業ディレクトリ : %{buildDir}
(※コマンドは任意のパスです)
deploy.batファイルの中身は以下のとおりです。
if "%1"=="デバッグ" ( set BUILD_MODE=debug ) else ( set BUILD_MODE=release ) if not exist deploy\nul ( mkdir deploy ) xcopy /C /Y %BUILD_MODE%\*.exe deploy\ windeployqt --%BUILD_MODE% deploy %BUILD_MODE%\%2.exe
C:\Qt\5.9.1\toolのフォルダは以下のような構成になっております。
以下のページが参考になります。
Observerパターンについて [C++]
Observerとは、英語で観察者を意味します。
Observer パターンとは、状態の変化を観察することを目的としたものですが、どちらかというと「観察」よりも「通知」に重点の置かれたものになっています。
あるインスタンスの状態が変化した際に、そのインスタンス自身が、「観察者」に状態の変化を「通知」する仕組みです。
<Observerパターンの定義 : クラス図>
[ObserverSample.h]
#include <vector> #include <algorithm> #include <iostream> class Observer { friend class Subject; public: virtual ~Observer() {} protected: virtual void update(Subject*) = 0; }; class Subject { private: std::vector<Observer*> obs_; public: // Observerを登録 void add_observer(Observer* o) { if (std::find(obs_.begin(), obs_.end(), o) == obs_.end()) { obs_.push_back(o); } } // Observerの登録抹消 void delete_observer(Observer* o) { auto iter = std::find(obs_.begin(), obs_.end(), o); if (iter != obs_.end()) { obs_.erase(iter); } } protected: // 登録されたObserverのハンドラを呼び出す // std::for_each ⇒ 範囲の全ての要素に、指定された関数を適用する // oの全ての要素にラムダ式を適用する // 【thisのキャプチャ】 // メンバ関数内では、thisをキャプチャすることでラムダ式内でメンバ変数、メンバ関数(update)を使用することができます。 // 下記のラムダ式では、thisをキャプチャして、vector[obs_]の各要素のObserverオブジェクトのupdateメソッドを使用しています。 void notify() { std::for_each(obs_.begin(), obs_.end(), [this](Observer* o) { o->update(this); }); } }; // 具象サブジェクト // 室温 class RoomTemp : public Subject { private: int value_; // public: RoomTemp(int initial) : value_(initial) {} void increment() // 室温を1度上げる { ++value_; notify(); } void decrement() // 室温を1度下げる { --value_; notify(); } int get_temp() const // 現在の室温 { return value_; } }; // 具象オブサーバクラス // 温度表示パネル : 室温の変化に応じて室温を表示する class TempDisp : public Observer { public: ~TempDisp() { std::cout << "お疲れ様でしたー" << std::endl; } protected: virtual void update(Subject* from) { int temp = static_cast<RoomTemp*>(from)->get_temp(); std::cout << "現在の温度: " << temp << "℃" << std::endl; } };
[main.cpp]
#include "ObserverSample.h" int main() { RoomTemp room1(20); RoomTemp room2(30); TempDisp disp1; TempDisp disp2; room1.add_observer(&disp1); room2.add_observer(&disp2); room1.increment(); room1.increment(); room1.increment(); room2.decrement(); room2.decrement(); room2.decrement(); }
実行結果
以下のサイトを参考にさせていただきました。
参考リンク
以下のリンクがわかりやすいです。 * 地下アイドルとアイドルオタクを疎結合にしてみたら、夢も希望もなくなった〜デザインパターンのObserverを考える〜 - Qiita
デザインパターン入門 (リンク編)
はじめに (書籍の紹介)
HeadFirstデザインパターンの本のコードのサンプルは、GitHubにあります。
http://www.wickedlysmart.com/headfirstdesignpatterns/code.htmlgithub.com
リンク1
パターン指向リファクタリング 読書メモ - mookjp.io
リンク2(言語別)
Qtでcsvファイルに書き込む方法 [Qt]
QTextStreamを用いることで、csvファイルに保存することが可能です。
csvファイル保存の形式に合わせるため、データごとにカンマで区切ります。今回は、10個のデータごとに改行します。
今回使用するデータは、日本語文字列データを使用しました。
以下がコードです。
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QString> #include <QDebug> #include <QFile> #include <QTextStream> #include <QFileDialog> #include <QMessageBox> #define Jstr(str) QString::fromLocal8Bit(str) MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); } MainWindow::~MainWindow() { delete ui; } void MainWindow::on_pushButton_clicked() { // csvファイルに書き込むQStringListを作成 QStringList writeList; QString str = Jstr("日本語"); for (int i = 1; i <= 100; i++) { if (i % 10){ writeList.append(str + " : " + QString::number(i) + ","); } else { // 改行コードはLFです writeList.append(str + " : " + QString::number(i) + "\n"); } } // fileNameとfile pathを求める QString fileName = QFileDialog::getSaveFileName(this, tr("Save Paint Info"), "", tr("Paint info (*.csv);;All Files (*)")); if (fileName.isEmpty()) return; QFile file(fileName); if (!file.open(QIODevice::WriteOnly)) { QMessageBox::information(this, tr("Unable to open file"), file.errorString()); return; } // デバッグ表示 foreach (QString item, writeList) { qDebug() << item; } // csvファイルに書き込む QTextStream out(&file); foreach (QString item, writeList) { out << item; } }
実行結果
不明なコンパイル時の出力はありますが、無事、csvファイルにデータを書き込むことができました。