2012年3月25日日曜日

フリーソフトの公開


はいどうもご無沙汰です。

作成しているフリーソフトの一つが完成しました。FreeSoftページよりダウンロードが可能です。

公開ソフトは以前告知していた「暗記カードソフト(C#)」ではなく、並行して作成していた「シューティングゲーム(C++)」のほうです。暗記カードソフトの次に公開しようと思っていたのですが、シューティングのほうが先にできたので先に公開しちゃいました。

もちろん暗記カードソフトも近いうちに公開しようと思っていますが、少し手直しが必要なので、もう少しかかりそうです。

んで、初めてシューティングゲームを作った感想ですが、やっぱり
「C++めんどくせぇし、難っ!」
ですね。造りはじめはいいんですが、設計にない機能の追加を始めると途端にコードが汚くなります。最初の設計がどれほど重要かがわかりましたよ。ええ。状態遷移やメニューに関してはもうswitchの嵐です。Mainについては「こんな汚ねぇMain.cpp生きとし生けるものとして許されるのか?」と自分で毒づいてしまったほどです。 ...まぁでも初めてですし、こんなもんでしょう。 少しずつコードの浄化を行なっていけばいいですしね。

本当にいい勉強になりました。

とりあえず以上です。


※シューティングゲーム作成にあたって龍神録プログラミングの館を参考にしました。C++ではなくCですが、かなり詳しく書かれており、チュートリアルを順に進めていくだけでかなりクォリティの高いものができます。ゲームプログラミングに興味のある方は見てみてはいかがでしょうか?

2012年3月17日土曜日

( Qt C++ )ステータスバーにウィジットを追加する。




フリーソフトを公開すると言っていましたが、どうもブログにはアップロードできそうにないので別ホームページを作成しそこにリンクをはって公開という形になりそうです。ですのでもう少しかかります。

フリーソフト自体はだいたい完成しました。暗記カードのようなソフトです。暗記カードを実際に買うとかさばるし、Vectorにサクッと問題と回答が作れてシンプルに出題できるフリーソフトがなかったので作りました。

言語はC#で1000~2000行くらいの小規模のものです。コードは汚いままですが、処理停止エラーが出ないことを確認したら試作版として近いうち公開します。



それでは表題の件やっていきます。

前回ステータスバーを使用するで基本的な使い方を扱いました。今回はステータスバーに他のウィジットを追加する方法をやっていきます。

サンプルは独自のものを使用します。
また、いつものようにQtCreaterの使用を前提とします。(QtCreaterなどの使い方は ”Qtをはじめよう" を見てください。)
サンプルはまっさらなメインウィンドウの状態を想定しています。ステータスバーの配置方法は省略します。わからないかたは「ステータスバーを使用する」の記事を見てください。

ではコードを


(mainwindow.h)
#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT
    
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
};



(mainwindow.cpp)
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "QLabel"
#include "QTextEdit"
#include "QPushButton"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QLabel *label = new QLabel(this);
    QLabel *label2 = new QLabel(this);
    QLabel *label3 = new QLabel(this);
    QTextEdit *textedit = new QTextEdit(this);
    QPushButton *button = new QPushButton(this);
    label->setText("status1");
    label2->setText("status2");
    label3->setText("status3");

    ui->statusBar->addPermanentWidget(label, 100);//右に追加
    ui->statusBar->addPermanentWidget(label2, 100);
    ui->statusBar->addPermanentWidget(textedit, 0);
    ui->statusBar->addPermanentWidget(button, 100);
    ui->statusBar->addWidget(label3, 100);//左に追加
}

MainWindow::~MainWindow()
{
    delete ui;
}


はい簡単ですね。addPermanentWidgetで右側にウィジットを追加。addWidgetで左にウィジットを追加していっています。(リファレンスへ


実行すると以下のようになります。

以上です。

2012年3月12日月曜日

( Qt C++ )ステータスバーを使用する。


はいそれでは表題の件やっていきます。

ステータスバーというのは
 
の赤矢印の部分を言います。

サンプルは独自のものを使用します。
また、いつものようにQtCreaterの使用を前提とします。(QtCreaterなどの使い方は ”Qtをはじめよう" を見てください。)

ではまずQt GUI アプリケーションプロジェクトでも作成してください。名前も適当でいいです。するとメインウィンドウが一つ作成されるはずです。この状態ですでにステータスバーは作成されているのでステータスバーに関しては何も作業は必要ありません。デザイナ上ではボタンを一つ貼って処理終了です。

ではコードに入ります。

(mainwindow.h)
#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT
    
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    
private slots:
    void on_pushButton_clicked();

private:
    Ui::MainWindow *ui;
};

(mainwindow.cpp)
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->statusBar->showMessage("Hello! World!");
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    ui->statusBar->showMessage("Pushed Button!");
}

はい簡単ですね。ボタンクリックシグナルでステータスバーの文字表示を変えているだけです。

実行すると以下のようになります。
(起動時画面)
 
(ボタンを押したとき)
 以上です。



※補足 手書きの場合は以下のコードを参考にしてメインウィンドウへステータスバーを追加してください。(デザイナが吐いたコードです。)

#ifndef UI_MAINWINDOW_H
#define UI_MAINWINDOW_H

#include <QtCore/QVariant>
#include <QtGui/QAction>
#include <QtGui/QApplication>
#include <QtGui/QButtonGroup>
#include <QtGui/QHeaderView>
#include <QtGui/QMainWindow>
#include <QtGui/QMenuBar>
#include <QtGui/QPushButton>
#include <QtGui/QStatusBar>
#include <QtGui/QToolBar>
#include <QtGui/QWidget>

QT_BEGIN_NAMESPACE

class Ui_MainWindow
{
public:
    QWidget *centralWidget;
    QPushButton *pushButton;
    QMenuBar *menuBar;
    QToolBar *mainToolBar;
    QStatusBar *statusBar;//-----------------------ここ

    void setupUi(QMainWindow *MainWindow)
    {
        if (MainWindow->objectName().isEmpty())
            MainWindow->setObjectName(QString::fromUtf8("MainWindow"));
        MainWindow->resize(400, 300);
        centralWidget = new QWidget(MainWindow);
        centralWidget->setObjectName(QString::fromUtf8("centralWidget"));
        pushButton = new QPushButton(centralWidget);
        pushButton->setObjectName(QString::fromUtf8("pushButton"));
        pushButton->setGeometry(QRect(160, 110, 75, 23));
        MainWindow->setCentralWidget(centralWidget);
        menuBar = new QMenuBar(MainWindow);
        menuBar->setObjectName(QString::fromUtf8("menuBar"));
        menuBar->setGeometry(QRect(0, 0, 400, 24));
        MainWindow->setMenuBar(menuBar);
        mainToolBar = new QToolBar(MainWindow);
        mainToolBar->setObjectName(QString::fromUtf8("mainToolBar"));
        MainWindow->addToolBar(Qt::TopToolBarArea, mainToolBar);
        
        //------------------------------------------------------------------------
        statusBar = new QStatusBar(MainWindow);
        statusBar->setObjectName(QString::fromUtf8("statusBar"));
        MainWindow->setStatusBar(statusBar);
        //------------------------------------------------------------------------        

        retranslateUi(MainWindow);

        QMetaObject::connectSlotsByName(MainWindow);
    } // setupUi

    void retranslateUi(QMainWindow *MainWindow)
    {
        MainWindow->setWindowTitle(QApplication::translate("MainWindow", "MainWindow", 0, QApplication::UnicodeUTF8));
        pushButton->setText(QApplication::translate("MainWindow", "Button", 0, QApplication::UnicodeUTF8));
    } // retranslateUi

};

namespace Ui {
    class MainWindow: public Ui_MainWindow {};
} // namespace Ui

QT_END_NAMESPACE

#endif // UI_MAINWINDOW_H