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

0 件のコメント: