ラベル 魅惑の Qyoto の投稿を表示しています。 すべての投稿を表示
ラベル 魅惑の Qyoto の投稿を表示しています。 すべての投稿を表示

2014-12-15

魅惑の Qyoto (7) - Fedora 21 での動作確認

Qyoto は Qt の .NET バインディングです。Fedora 20 の時に、新しい Qyoto を入手して「魅惑の Qyoto」と題して、Mono 環境でサンプルを紹介していましたが、一時期 CentOS 7 へ乗り換えてから中断していました。Fedora 21 では、Fedora 標準のレポジトリから Qyoto のパッケージが利用できますので、まずは動作確認をしてみます。

Fedora 21 における Mono の開発環境

Fedora 21 における Mono / Qyoto の開発環境の主要なパッケージは、下記の通りです。

  • mono-core-2.10.8-8.fc21.x86_64
  • qt-4.8.6-18.fc21.x86_64
  • qyoto-4.14.3-1.fc21.x86_64
  • qyoto-devel-4.14.3-1.fc21.x86_64

Fedora 21 で Mono のバージョンが 2.10 から 3.4 へ移行するものと思っていましたが、あらためて Changes/Mono 3.4 - FedoraProject を確認すると、ターゲットリリースは Fedora 22 になっていました。なお、Mono の最新バージョンは 3.8 です。

Mono の今後

Microsoft は 11 月 12 日、.NET Framework のサーバーサイド向け技術 .NET Core をオープンソース化することを発表して関係者を驚かせました 1.。"Microsoft" という言葉と "オープンソース" という言葉が、今や同一の文章の中で使われる時代になったのです。Mono Project はこの動きに呼応して、今後統合に向けて動いていくことを表明しています 2.。

  1. 「.NET Core」がオープンソース化、MacやLinuxもサポート | SourceForge.JP Magazine (2014年11月13日)
  2. .NET Source Code Integration | Mono(2014年11月18日)

そういうわけで、.NET にまつわる技術動向が注目されますが、まずは現状でできることを整理しておきましょう。

Hello World 再び

mono のバージョンは 2.10 ですが、ひとまず Hello World のプログラムの動作を確認してみます。「魅惑の Qyoto (1) - Hello Wold!」で紹介したサンプルで確認しますので、ソースを再掲します。

List: hello-qyoto.cs
using System;
using Qyoto;

/**
 * ZetCode Qyoto C# tutorial
 *
 * This program creates a quit
 * button. When we press the button,
 * the application terminates. 
 *
 * @author Jan Bodnar
 * website zetcode.com
 * last modified October 2012
 *
 * modified by Fuhito Suguri
 * last modified 13-May-2014
 */


public class QyotoApp : QWidget
{
    public QyotoApp ()
    {
        WindowTitle = "mono/qyoto";

        InitUI ();

        Resize (180, 60);
        Move (300, 300);
        Show ();
    }

    public void InitUI ()
    {    
        QPushButton but = new QPushButton ("こんにちは、世界!", this);

        Connect (but, SIGNAL ("clicked()"), qApp, SLOT ("quit()"));
        but.SetGeometry (10, 10, 160, 40);
    }

    [STAThread]
    public static int Main (String[] args)
    {
        new QApplication (args);
        new QyotoApp ();
        return QApplication.Exec ();
    }
}

コンパイルおよび実行例を以下に示します。

$ mcs hello-qyoto.cs -pkg:qyoto
$ mono hello-qyoto.exe

Mono の最近のバージョンについては、下記からパッケージをダウンロードして試してみる予定です。

  1. software.opensuse.org: パッケージのインストール: home:tpokorra:mono / mono-opt

2014-06-07

魅惑の Qyoto (6) - SpinBox, Slider & Dial

Qyoto (Qt) を用いて、今回は、設定した範囲の数字を調節するウィジェット 3 種類を紹介します。

まず、Fedora 20 における Mono / Qyoto の開発環境の主要なパッケージですが、前回と同じく以下の通りです。

  • mono-core-3.4.0-2.fc20.x86_64
  • qt-4.8.6-5.fc20.x86_64
  • qyoto-4.12.5-1.fc20.x86_64
  • qyoto-devel-4.12.5-1.fc20.x86_64

スピンボックス

スピンボックス QSpinBox は、ボックスに表示されている数値データを,ボックスの右端にあるアップダウンボタンで増減させて変更するウィジェットです。「↑」「↓」キーやマウスホイールでも調節できます。

List: spinbox.cs
using System;
using Qyoto;

/**
 * ZetCode Qyoto C# tutorial
 *
 * This program uses the QSpinBox widget.
 * The option selected from the combo box is
 * displayed in the label widget.
 *
 * @author Jan Bodnar
 * website zetcode.com
 * last modified October 2012
 * 
 * modified by Fujito Suguri
 * last modified 7-Jun-2014
 */

public class QyotoApp : QWidget
{
    public QyotoApp ()
    {
        WindowTitle = "スピンボックス";

        InitUI ();

        Move (100, 100);
        Show ();
    }

    void InitUI ()
    {
        QSpinBox sp = new QSpinBox ();
        sp.SetRange (0, 100);
        sp.SetValue(50);
        sp.Alignment = (uint) AlignmentFlag.AlignRight;
        sp.SetSizePolicy (QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Preferred);

        Connect (sp, SIGNAL ("valueChanged(int)"), this, SLOT ("OnValueChanged(int)"));

        QVBoxLayout vbox = new QVBoxLayout (this);
        vbox.AddWidget (sp);
    }

    [Q_SLOT]
    void OnValueChanged (int i)
    {
        Console.WriteLine ("値が " + i + " になりました。");
    }

    [STAThread]
    public static int Main (String[] args)
    {
        new QApplication (args);
        new QyotoApp ();
        return QApplication.Exec ();
    }
}

コンパイルおよび実行例を以下に示します。

$ mcs spinbox.cs -pkg:qyoto
$ mono spinbox.exe
値が 51 になりました。
値が 52 になりました。
値が 53 になりました。

スライダー

スライダー QSlider はツマミをマウスでドラッグすることで、値を変更できるウィジェットです。「↑」「↓」キーやマウスホイールでも調節できます。

List: slider.cs
using System;
using Qyoto;

/**
 * ZetCode Qyoto C# tutorial
 *
 * This program uses the QSlider widget.
 * The option selected from the combo box is
 * displayed in the label widget.
 *
 * @author Jan Bodnar
 * website zetcode.com
 * last modified October 2012
 * 
 * modified by Fujito Suguri
 * last modified 7-Jun-2014
 */

public class QyotoApp : QWidget
{
    public QyotoApp ()
    {
        WindowTitle = "スライダー";

        InitUI ();

        Move (100, 100);
        Show ();
    }

    void InitUI ()
    {
        QSlider sl = new QSlider ();
        sl.SetRange (0, 100);
        sl.SetValue (50);
        sl.SetOrientation (Orientation.Horizontal);
        sl.FocusPolicy = FocusPolicy.StrongFocus;
        sl.tickPosition = QSlider.TickPosition.TicksBelow;
        sl.TickInterval = 10;
        sl.SetSizePolicy (QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Preferred);

        Connect (sl, SIGNAL ("valueChanged(int)"), this, SLOT ("OnValueChanged(int)"));

        QVBoxLayout vbox = new QVBoxLayout (this);
        vbox.AddWidget (sl);
    }

    [Q_SLOT]
    void OnValueChanged (int i)
    {
        Console.WriteLine ("値が " + i + " になりました。");
    }

    [STAThread]
    public static int Main (String[] args)
    {
        new QApplication (args);
        new QyotoApp ();
        return QApplication.Exec ();
    }
}

コンパイルおよび実行例を以下に示します。

$ mcs slider.cs -pkg:qyoto
$ mono slider.exe
値が 51 になりました。
値が 52 になりました。
値が 53 になりました。

ダイヤル †

† 「だいある」で一発変換できなかったのでダイヤルにしました。

ダイヤル QDial は、スライダーと同様にツマミをマウスでドラッグすることで、値を変更できるウィジェットですが直線的ではなく回転的に値を変化させるウィジェットです。「↑」「↓」キーやマウスホイールでも調節できます。

List: dial.cs
using System;
using Qyoto;

/**
 * ZetCode Qyoto C# tutorial
 *
 * This program uses the QDial widget.
 * The option selected from the combo box is
 * displayed in the label widget.
 *
 * @author Jan Bodnar
 * website zetcode.com
 * last modified October 2012
 * 
 * modified by Fujito Suguri
 * last modified 7-Jun-2014
 */

public class QyotoApp : QWidget
{
    public QyotoApp ()
    {
        WindowTitle = "ダイヤル";

        InitUI ();

        Move (100, 100);
        Show ();
    }

    void InitUI ()
    {
        QDial dl = new QDial ();
        dl.SetRange (0, 100);
        dl.SetValue (50);
        dl.SetNotchesVisible (true);
        dl.FocusPolicy = FocusPolicy.StrongFocus;

        dl.SetSizePolicy (QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Preferred);

        Connect (dl, SIGNAL ("valueChanged(int)"), this, SLOT ("OnValueChanged(int)"));

        QVBoxLayout vbox = new QVBoxLayout (this);
        vbox.AddWidget (dl);
    }

    [Q_SLOT]
    void OnValueChanged (int i)
    {
        Console.WriteLine ("値が " + i + " になりました。");
    }

    [STAThread]
    public static int Main (String[] args)
    {
        new QApplication (args);
        new QyotoApp ();
        return QApplication.Exec ();
    }
}

コンパイルおよび実行例を以下に示します。

$ mcs dial.cs -pkg:qyoto
$ mono dial.exe
値が 51 になりました。
値が 52 になりました。
値が 53 になりました。

参考サイト

  1. C# Qyoto tutorial
  2. Qyoto: Main Page - Qyoto Documentation

2014-05-31

魅惑の Qyoto (5) - ListWidget & ComboBox

Qyoto (Qt) を用いたリストウィジェットとコンボボックスを紹介します。

まず、Fedora 20 における Mono / Qyoto の開発環境の主要なパッケージですが、前回と同じく以下の通りです。

  • mono-core-3.4.0-2.fc20.x86_64
  • qt-4.8.6-5.fc20.x86_64
  • qyoto-4.12.5-1.fc20.x86_64
  • qyoto-devel-4.12.5-1.fc20.x86_64

リストウィジェット

リストウィジェット QListWidget はあらかじめ用意された選択肢の中から 1 つあるいは複数の項目を選択するためのウィジェットです。

List: listwidget.cs
using System;
using System.Collections.Generic;
using Qyoto;

/**
 * ZetCode Qyoto C# tutorial
 *
 * This program uses the QListWidget widget.
 * The option selected from the lw box is
 * displayed in the label widget.
 *
 * @author Jan Bodnar
 * website zetcode.com
 * last modified October 2012
 * 
 * modified by Fujito Suguri
 * last modified 27-May-2014
 */

public class QyotoApp : QWidget
{
    public QyotoApp ()
    {
        WindowTitle = "リストウィジェット";

        InitUI ();

        Move (100, 100);
        Show ();
    }

    public void InitUI ()
    {
        QLabel label = new QLabel ("都道府県リスト");
        QListWidget lw = new QListWidget ();

        label.SetSizePolicy (QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed);
        lw.SetSizePolicy (QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Preferred);

        List prefList = new List (new string[] {
            "北海道", "青森県", "岩手県", "宮城県", "秋田県", "山形県", "福島県", "茨城県", "栃木県",
            "群馬県", "埼玉県", "千葉県", "東京都", "神奈川県", "山梨県", "長野県", "新潟県", "富山県",
            "石川県", "福井県", "岐阜県", "静岡県", "愛知県", "三重県", "滋賀県", "京都府", "大阪府",
            "兵庫県", "奈良県", "和歌山県", "鳥取県", "島根県", "岡山県", "広島県", "山口県", "徳島県",
            "香川県", "愛媛県", "高知県", "福岡県", "佐賀県", "長崎県", "熊本県", "大分県", "宮崎県",
            "鹿児島県", "沖縄県"
        });

        foreach (string pref in prefList) {
            lw.AddItem (pref);
        }

        Connect (lw, SIGNAL ("itemSelectionChanged()"), this, SLOT ("OnSelected()"));

        QVBoxLayout vbox = new QVBoxLayout (this);
        vbox.AddWidget (label);
        vbox.AddWidget (lw);
    }

    [Q_SLOT]
    public void OnSelected ()
    {
        QListWidget l = (QListWidget)Sender ();
        Console.WriteLine (l.CurrentItem ().Text () + "が選択されました。");
    }

    [STAThread]
    public static int Main (String[] args)
    {
        new QApplication (args);
        new QyotoApp ();
        return QApplication.Exec ();
    }
}

コンパイルおよび実行例を以下に示します。

$ mcs listwidget.cs -pkg:qyoto
$ mono listwidget.exe
岩手県が選択されました。
福島県が選択されました。

コンボボックス

コンボボックス QComboBox は文字入力あるいは表示のための矩形領域と項目選択リストを組み合わせたウィジェットです。

List: combobox.cs
using System;
using System.Collections.Generic;
using Qyoto;

/**
 * ZetCode Qyoto C# tutorial
 *
 * This program uses the QComboBox widget.
 * The option selected from the combo box is
 * displayed in the label widget.
 *
 * @author Jan Bodnar
 * website zetcode.com
 * last modified October 2012
 * 
 * modified by Fujito Suguri
 * last modified 27-May-2014
 */

public class QyotoApp : QWidget
{
    public QyotoApp ()
    {
        WindowTitle = "コンボボックス";

        InitUI ();

        Move (100, 100);
        Show ();
    }

    public void InitUI ()
    {
        QLabel label = new QLabel ("都道府県リスト");
        QComboBox combo = new QComboBox (this);

        label.SetSizePolicy (QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Preferred);
        combo.SetSizePolicy (QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Preferred);

        List prefList = new List (new string[] {
            "北海道", "青森県", "岩手県", "宮城県", "秋田県", "山形県", "福島県", "茨城県", "栃木県",
            "群馬県", "埼玉県", "千葉県", "東京都", "神奈川県", "山梨県", "長野県", "新潟県", "富山県",
            "石川県", "福井県", "岐阜県", "静岡県", "愛知県", "三重県", "滋賀県", "京都府", "大阪府",
            "兵庫県", "奈良県", "和歌山県", "鳥取県", "島根県", "岡山県", "広島県", "山口県", "徳島県",
            "香川県", "愛媛県", "高知県", "福岡県", "佐賀県", "長崎県", "熊本県", "大分県", "宮崎県",
            "鹿児島県", "沖縄県"
        });

        foreach (string pref in prefList) {
            combo.AddItem (pref);
        }

        Connect (combo, SIGNAL ("activated(QString)"), this, SLOT ("OnActivated(QString)"));

        QHBoxLayout hbox = new QHBoxLayout (this);
        hbox.AddWidget (label);
        hbox.AddWidget (combo);
    }

    [Q_SLOT]
    public void OnActivated (string text)
    {
        Console.WriteLine (text + "が選択されました。");
    }

    [STAThread]
    public static int Main (String[] args)
    {
        new QApplication (args);
        new QyotoApp ();
        return QApplication.Exec ();
    }
}

コンパイルおよび実行例を以下に示します。

$ mcs combobox.cs -pkg:qyoto
$ mono combo.exe
岩手県が選択されました。
福島県が選択されました。

参考サイト

  1. C# Qyoto tutorial
  2. Qyoto: Main Page - Qyoto Documentation

2014-05-25

魅惑の Qyoto (4) - Buttons

Qyoto (Qt) を用いたボタン類のウィジェットを紹介します。Signal/Slot の使い方についてですが、参考文献 1 で紹介しているやり方ではコンパイルできなかったため、違うやり方をしています。この部分は改善の余地がありそうだということをご了承下さい。

まず、Fedora 20 における Mono / Qyoto の開発環境の主要なパッケージですが、前回と同じく以下の通りです。

  • mono-core-3.4.0-2.fc20.x86_64
  • qt-4.8.6-5.fc20.x86_64
  • qyoto-4.12.5-1.fc20.x86_64
  • qyoto-devel-4.12.5-1.fc20.x86_64

プッシュボタン

プッシュボタン QPushButton は Hello World! でも使ったウィジェットですが、再度紹介します。ボタンをマウスでクリックすると、イベント clicked() などが発生して、そのイベントに対応した処理をおこなうウィジェットです。

List: pushbutton.cs
using System;
using Qyoto;

/**
 * ZetCode Qyoto C# tutorial
 *
 * This program creates a quit
 * button. When we press the button,
 * the application terminates. 
 *
 * @author Jan Bodnar
 * website zetcode.com
 * last modified October 2012
 * 
 * modified by Fuhito Suguri
 * last modified 25-May-2014
 */


public class QyotoApp : QWidget
{
    public QyotoApp ()
    {
        WindowTitle = "ボタン";

        InitUI ();
        Move (100, 100);
        Show ();
    }

    public void InitUI ()
    {    
        QPushButton but1 = new QPushButton ("ボタンA");
        QPushButton but2 = new QPushButton ("ボタンB");
        QPushButton but3 = new QPushButton ("ボタンC");

        but1.SetSizePolicy (QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding);
        but2.SetSizePolicy (QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding);
        but3.SetSizePolicy (QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding);

        Connect (but1, SIGNAL ("clicked()"), this, SLOT ("OnClicked()"));
        Connect (but2, SIGNAL ("clicked()"), this, SLOT ("OnClicked()"));
        Connect (but3, SIGNAL ("clicked()"), this, SLOT ("OnClicked()"));

        QVBoxLayout vbox = new QVBoxLayout (this);
        vbox.AddWidget (but1);
        vbox.AddWidget (but2);
        vbox.AddWidget (but3);
    }

    [Q_SLOT]
    public void OnClicked ()
    {
        QPushButton b = (QPushButton)Sender ();
        Console.WriteLine (Sender () + ":" + b.Text + "がクリックされました。");
    }

    [STAThread]
    public static int Main (String[] args)
    {
        new QApplication (args);
        new QyotoApp ();
        return QApplication.Exec ();
    }
}

コンパイルおよび実行例を以下に示します。

$ mcs pushbutton.cs -pkg:qyoto
$ mono pushbutton.exe
Qyoto.QPushButton:ボタンAがクリックされました。
Qyoto.QPushButton:ボタンBがクリックされました。
Qyoto.QPushButton:ボタンCがクリックされました。

チェックボックス

チェックボックス QCheckBox は、特定の項目のオンとオフ(二値)を切り替えるために用いられるウィジェットで、オンとオフの状態が保持されます。

List: checkbox.cs
using System;
using Qyoto;

/**
 * ZetCode Qyoto C# tutorial
 *
 * This program creates a quit
 * button. When we press the button,
 * the application terminates. 
 *
 * @author Jan Bodnar
 * website zetcode.com
 * last modified October 2012
 * 
 * modified by Fuhito Suguri
 * last modified 25-May-2014
 */


public class QyotoApp : QWidget
{
    public QyotoApp ()
    {
        WindowTitle = "チェックボックス";

        InitUI ();
        Move (100, 100);
        Show ();
    }

    public void InitUI ()
    {    
        QCheckBox chk1 = new QCheckBox ("チェックボックスA");
        QCheckBox chk2 = new QCheckBox ("チェックボックスB");
        QCheckBox chk3 = new QCheckBox ("チェックボックスC");

        chk1.SetSizePolicy (QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding);
        chk2.SetSizePolicy (QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding);
        chk3.SetSizePolicy (QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding);

        Connect (chk1, SIGNAL ("clicked()"), this, SLOT ("OnClicked()"));
        Connect (chk2, SIGNAL ("clicked()"), this, SLOT ("OnClicked()"));
        Connect (chk3, SIGNAL ("clicked()"), this, SLOT ("OnClicked()"));

        QVBoxLayout vbox = new QVBoxLayout (this);
        vbox.AddWidget (chk1);
        vbox.AddWidget (chk2);
        vbox.AddWidget (chk3);
    }

    [Q_SLOT]
    public void OnClicked ()
    {
        string statusMsg;
        QCheckBox c = (QCheckBox)Sender ();
        if (c.Checked) {
            statusMsg = "オン";
        } else {
            statusMsg = "オフ";
        }
        Console.WriteLine (Sender () + ":" + c.Text + "が" + statusMsg + "になりました。");
    }

    [STAThread]
    public static int Main (String[] args)
    {
        new QApplication (args);
        new QyotoApp ();
        return QApplication.Exec ();
    }
}

コンパイルおよび実行例を以下に示します。

$ mcs checkbox.cs -pkg:qyoto
$ mono checkbox.exe
Qyoto.QCheckBox:チェックボックスAがオンになりました。
Qyoto.QCheckBox:チェックボックスBがオンになりました。
Qyoto.QCheckBox:チェックボックスCがオンになりました。
Qyoto.QCheckBox:チェックボックスAがオフになりました。
Qyoto.QCheckBox:チェックボックスBがオフになりました。

ラジオボタン

ラジオボタン QRadioButton は、複数の項目の中から 1 つだけ選択させるために用いられるウィジェットです。Qt の場合、親ウィジェットが同じであれば複数のラジオボタンは同じグループとして扱われます。同じ親の下で、複数のラジオボタンを複数のグループで管理したい場合には、QButtonGroup でグループを区別します。以下の例ではラジオボタンA、B、Cと、ラジオボタンD、Eを別のグループとして扱っています。

List: radiobutton.cs
using System;
using Qyoto;

/**
 * ZetCode Qyoto C# tutorial
 *
 * This program creates a quit
 * button. When we press the button,
 * the application terminates. 
 *
 * @author Jan Bodnar
 * website zetcode.com
 * last modified October 2012
 * 
 * modified by Fuhito Suguri
 * last modified 25-May-2014
 */


public class QyotoApp : QWidget
{
    public QyotoApp ()
    {
        WindowTitle = "ラジオボタン";

        InitUI ();
        Move (100, 100);
        Show ();
    }

    public void InitUI ()
    {    
        QButtonGroup g1 = new QButtonGroup ();
        QButtonGroup g2 = new QButtonGroup ();

        QRadioButton rb1 = new QRadioButton ("ラジオボタンA");
        QRadioButton rb2 = new QRadioButton ("ラジオボタンB");
        QRadioButton rb3 = new QRadioButton ("ラジオボタンC");
        QRadioButton rb4 = new QRadioButton ("ラジオボタンD");
        QRadioButton rb5 = new QRadioButton ("ラジオボタンE");

        rb1.SetSizePolicy (QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding);
        rb2.SetSizePolicy (QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding);
        rb3.SetSizePolicy (QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding);            

        Connect (rb1, SIGNAL ("clicked()"), this, SLOT ("OnClicked()"));
        Connect (rb2, SIGNAL ("clicked()"), this, SLOT ("OnClicked()"));
        Connect (rb3, SIGNAL ("clicked()"), this, SLOT ("OnClicked()"));
        Connect (rb4, SIGNAL ("clicked()"), this, SLOT ("OnClicked()"));
        Connect (rb5, SIGNAL ("clicked()"), this, SLOT ("OnClicked()"));

        g1.AddButton (rb1, 1);
        g1.AddButton (rb2, 2);
        g1.AddButton (rb3, 3);
        g2.AddButton (rb4, 4);
        g2.AddButton (rb5, 5);

        QVBoxLayout vbox = new QVBoxLayout (this);
        vbox.AddWidget (rb1);
        vbox.AddWidget (rb2);
        vbox.AddWidget (rb3);
        vbox.AddWidget (rb4);
        vbox.AddWidget (rb5);
    }

    [Q_SLOT]
    public void OnClicked ()
    {
        QRadioButton r = (QRadioButton)Sender ();
        Console.WriteLine (Sender () + ":" + r.Text + "がオンになりました。");
    }

    [STAThread]
    public static int Main (String[] args)
    {
        new QApplication (args);
        new QyotoApp ();
        return QApplication.Exec ();
    }
}

コンパイルおよび実行例を以下に示します。

$ mcs radiobutton.cs -pkg:qyoto
$ mono radiobutton.exe
Qyoto.QRadioButton:ラジオボタンAがオンになりました。
Qyoto.QRadioButton:ラジオボタンBがオンになりました。
Qyoto.QRadioButton:ラジオボタンCがオンになりました。
Qyoto.QRadioButton:ラジオボタンDがオンになりました。
Qyoto.QRadioButton:ラジオボタンEがオンになりました。

参考サイト

  1. C# Qyoto tutorial
  2. Qyoto: Main Page - Qyoto Documentation

2014-05-24

魅惑の Qyoto (3) - Label

Qyoto (Qt) を用いたウィジェットを紹介していきますが、まだ Qt の Signal/Slot の理解が十分ではないので、今回は文字を表示するだけのラベルを紹介します。

Fedora 20 における Mono / Qyoto の開発環境の主要なパッケージは、前回と同じく以下の通りです。

  • mono-core-3.4.0-2.fc20.x86_64
  • qt-4.8.6-5.fc20.x86_64
  • qyoto-4.12.5-1.fc20.x86_64
  • qyoto-devel-4.12.5-1.fc20.x86_64

ラベル

ラベル QLabel は、文字列(あるいは画像)を表示するウィジェットです。

List: label.cs
using System;
using Qyoto;

/**
 * ZetCode Qyoto C# tutorial
 *
 * This program uses QLabel to 
 * show lyrics of a song.
 *
 * @author Jan Bodnar
 * website zetcode.com
 * last modified October 2012
 * 
 * modified by Fuhito Suguri
 * laste modified 24-May-2014
 */

public class QyotoApp : QWidget
{
    public QyotoApp ()
    {
        WindowTitle = "雨ニモマケズ";

        InitUI ();

        Move (100, 100);
        Show ();
    }

    public void InitUI ()
    {
        string text = @"雨ニモマケズ
風ニモマケズ
雪ニモ夏ノ暑サニモマケヌ
丈夫ナカラダヲモチ
慾ハナク
決シテ瞋ラズ
イツモシヅカニワラッテヰル
一日ニ玄米四合ト
味噌ト少シノ野菜ヲタベ
アラユルコトヲ
ジブンヲカンジョウニ入レズニ
ヨクミキキシワカリ
ソシテワスレズ
野原ノ松ノ林ノ蔭ノ
小サナ萓ブキノ小屋ニヰテ
東ニ病気ノコドモアレバ
行ッテ看病シテヤリ
西ニツカレタ母アレバ
行ッテソノ稲ノ朿ヲ負ヒ
南ニ死ニサウナ人アレバ
行ッテコハガラナクテモイヽトイヒ
北ニケンクヮヤソショウガアレバ
ツマラナイカラヤメロトイヒ
ヒドリノトキハナミダヲナガシ
サムサノナツハオロオロアルキ
ミンナニデクノボートヨバレ
ホメラレモセズ
クニモサレズ
サウイフモノニ
ワタシハナリタイ";

        QLabel label = new QLabel (text);
        label.Font = new QFont (null, 8);
        label.SetSizePolicy (QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding);

        QVBoxLayout vbox = new QVBoxLayout (this);
        vbox.AddWidget (label);
    }

    [STAThread]
    public static int Main (String[] args)
    {
        new QApplication (args);
        new QyotoApp ();
        return QApplication.Exec ();
    }
}

フォントの設定をしている QFont では、日本語フォントを制御する確認ができていないので、とりあえずフォントを null にしてサイズだけ指定しています。

コンパイルおよび実行例を以下に示します。

$ mcs label.cs -pkg:qyoto
$ mono label.exe


参考サイト

  1. C# Qyoto tutorial
  2. Qyoto: Main Page - Qyoto Documentation

2014-05-15

魅惑の Qyoto (2) - Layout

Qyoto (Qt) でウィジェットを配置するには、Hello Wold! で紹介したサンプルのように絶対座標を指定する方法の他に、レイアウトマネージャを使う方法があります。レイアウトには「ボックスレイアウト」「グリッドレイアウト」「フォームレイアウト」そして「スタックトレイアウト」の四種類がありますが、その内最初の 2 つを使ってウィジェットを配置するサンプルを紹介します。

ここでは二種類のサンプルを紹介しますが、どちらもベタなコーディングで申し訳ありません(もう少し繰り返しを無くしたすっきりしたコーディングにしたいのですが、できていません)。

Fedora 20 における Mono / Qyoto の開発環境の主要なパッケージは、前回と同じく以下の通りです。

  • mono-core-3.4.0-2.fc20.x86_64
  • qt-4.8.6-5.fc20.x86_64
  • qyoto-4.12.5-1.fc20.x86_64
  • qyoto-devel-4.12.5-1.fc20.x86_64

ボックスレイアウト

縦方向 (QVBoxLayout) あるいは横方向 (QHBoxLayout) にウィジェットを配置するレイアウトマネージャです。レイアウトマネージャを組み合わせて、縦横にウィジェットを配置することができます。

参考サイト 1. に掲載されているサンプルをベースにしたボックスレイアウトのサンプルを示します。

List: boxlayout.cs
using System;
using Qyoto;

/**
 * ZetCode Qyoto C# tutorial
 *
 * In this program, use box layouts
 * to position two buttons in the
 * bottom right corner of the window.
 *
 * @author Jan Bodnar
 * website zetcode.com
 * last modified October 2012
 *
 * modified by Fuhito Suguri
 * last modified 14-May-2014
 */

public class QyotoApp : QWidget 
{
    public QyotoApp() 
    {
        WindowTitle = "BoxLayout";

        InitUI();

        Move(300, 300);
        Show();
    }

    void InitUI() 
    {    
        QPushButton but_1 = new QPushButton("1", this);
        QPushButton but_2 = new QPushButton("2", this);
        QPushButton but_3 = new QPushButton("3", this);
        QPushButton but_4 = new QPushButton("4", this);
        QPushButton but_5 = new QPushButton("5", this);

        but_1.SetSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding);
        but_2.SetSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding);
        but_3.SetSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding);
        but_4.SetSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding);
        but_5.SetSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding);

        QVBoxLayout vbox = new QVBoxLayout(this);
        QHBoxLayout hbox1 = new QHBoxLayout();
        QHBoxLayout hbox2 = new QHBoxLayout();

        hbox1.AddWidget(but_1);
        hbox1.AddWidget(but_2);
        hbox1.AddWidget(but_3);

        hbox2.AddWidget(but_4);
        hbox2.AddWidget(but_5);

        vbox.AddLayout(hbox1);
        vbox.AddLayout(hbox2);
    }

    [STAThread]
    public static int Main(String[] args) 
    {
        new QApplication(args);
        new QyotoApp();
        return QApplication.Exec();
    }
}

コンパイルおよび実行例を以下に示します。

$ mcs boxlayout.cs -pkg:qyoto
$ mono boxlayout.exe


グリッドレイアウト

QGridLayout は、格子状にウィジェットを配置するレイアウトマネージャです。

次に、同じく参考サイト 1. に掲載されているサンプルをベースにした QGridLayout のサンプルを示します。

List: gridlayout.cs
using System;
using Qyoto;

/**
 * ZetCode Qyoto C# tutorial
 *
 * In this program, use the QGridLayout manager
 * to create a New Folder example.
 *
 * @author Jan Bodnar
 * website zetcode.com
 * last modified October 2012
 *
 * modified by Fuhito Suguri
 * last modified 14-May-2014
 */

public class QyotoApp : QWidget 
{
    public QyotoApp() 
    {
        WindowTitle = "GridLayout";

        InitUI();

        Move(300, 300);
        Show();
    }

    void InitUI() 
    {
        QGridLayout grid = new QGridLayout(this);

        QPushButton but_1 = new QPushButton("1", this);
        QPushButton but_2 = new QPushButton("2", this);
        QPushButton but_3 = new QPushButton("3", this);
        QPushButton but_4 = new QPushButton("4", this);
        QPushButton but_5 = new QPushButton("5", this);

        but_1.SetSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding);
        but_2.SetSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding);
        but_3.SetSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding);
        but_4.SetSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding);
        but_5.SetSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding);

        grid.AddWidget(but_1, 0, 0);
        grid.AddWidget(but_2, 0, 1);
        grid.AddWidget(but_3, 0, 2);
        grid.AddWidget(but_4, 1, 0);
        grid.AddWidget(but_5, 1, 1, 1, 2);
    }

    [STAThread]
    public static int Main(String[] args) 
    {
        new QApplication(args);
        new QyotoApp();
        return QApplication.Exec();
    }
}

コンパイルおよび実行例を以下に示します。

$ mcs gridlayout.cs -pkg:qyoto
$ mono gridlayout.exe


参考サイト

  1. C# Qyoto tutorial
  2. Qyoto: Main Page - Qyoto Documentation

2014-05-14

魅惑の Qyoto (1) - Hello World!

Java のように、Linux 上で開発したプログラムを Windows でも動作させることができる開発環境を常に探索していますが、.Net/Mono もそのように利用できそうだと注目しています。

ただ GUI ライブラリに何を使うかが悩みの種です。C# については、Windows 上では .Net、Linux 上では Mono の開発環境を使えば良いと考えています。そういう考えに立って Windows と Linux の両方で利用できる GUI ライブラリを考えた場合、Linux 上での Mono / GTk# の組み合わせは問題ないのですが、Windows 上で Mono 抜きに .Net / GTk# の開発環境を構築する壁にぶつかります。

そこで wxWidgets の wx.Net や Qt の Qyoto などの .Net / Mono バインディングを調べてみたところ、Qyoto が Fedora で利用できることが判りましたので、とりあえず試してみました。

Fedora 20 における Mono / Qyoto の開発環境の主要なパッケージは以下の通りです。なお、Fedora 20 における Mono-3.4 系のパッケージの入手については、本記事の最後にある、参考サイト 1. を参照してください。

  • mono-core-3.4.0-2.fc20.x86_64
  • qt-4.8.6-5.fc20.x86_64
  • qyoto-4.12.5-1.fc20.x86_64
  • qyoto-devel-4.12.5-1.fc20.x86_64

参考サイト 2. に掲載されているサンプルをベースにして、簡単な Hello World! プログラムで動作確認をしました。

List: hello-qyoto.cs
using System;
using Qyoto;

/**
 * ZetCode Qyoto C# tutorial
 *
 * This program creates a quit
 * button. When we press the button,
 * the application terminates. 
 *
 * @author Jan Bodnar
 * website zetcode.com
 * last modified October 2012
 *
 * modified by Fuhito Suguri
 * last modified 13-May-2014
 */


public class QyotoApp : QWidget 
{
    public QyotoApp() 
    {
        WindowTitle = "mono/qyoto";

        InitUI();

        Resize(180, 60);
        Move(300, 300);
        Show();
    }

    public void InitUI() 
    {    
        QPushButton but = new QPushButton("こんにちは、世界!", this);

        Connect(but, SIGNAL("clicked()"), qApp, SLOT("quit()"));
        but.SetGeometry(10, 10, 160, 40);
    }

    [STAThread]
    public static int Main(String[] args) 
    {
        new QApplication(args);
        new QyotoApp();
        return QApplication.Exec();
    }
}

Mono によるコンパイルおよび実行例を以下に示します。

$ mcs hello-qyoto.cs -pkg:qyoto
$ mono hello-qyoto.exe

参考サイト 2. に掲載されているサンプルをざっとみたところ、これなら自分でもできそうだと思いましたので、そこに掲載されているサンプルをベースに、今後何回かに分けて Qyoto を使った Mono のプログラミング例を紹介していく予定です 4.。

ちなみに、Windows 上での実行ですが、まだ成功していません。これについても調査結果を紹介していきたいと考えています。

参考サイト

  1. bitWalk's: Mono で GUI プログラミング - Mono 3.4 を試す
  2. C# Qyoto tutorial
  3. Development/Languages/Qyoto - KDE TechBase
  4. bitWalk's: 魅惑の Qyoto