2012年3月6日火曜日

( Qt C++ )メニュー項目を使用する


フリーソフトページはアップロードの方法などまだ確認していないので工事中です。今月中には展開しようとおもっているのですが...まぁどうなるかわかりません。

はいそれでは表題の件やっていきます。
今日からはメニュー項目を重点的にやっていこうと思います。
メニュー項目というのはよく見る


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

ではまずQt Createrを使用してデザイナ上からメニュー項目をクリックしてアクションを追加してください。Fileの下にNew,Openを追加してください。ここで'&'をつけたものがアクセスキーとなります。例えば"&File"と入力すればAlt+Fでアクセスできるようになります。


もしQtCreaterのデザイナを使用しないで作る場合はQActionを定義して自分で追加していかなければなりません。一応デザイナから吐き出されるコードを補足でこの記事の最後に乗せておきますのでそちらを参考にしてください。

はい、これで下準備はできました。次に各メニュー項目のシグナルを捕捉し、処理を記述していきます。今回はクリックを検知し、どのメニューを選択したかを表示するメッセージボックスを表示していきます。

ではコードを

(mainwindow.h)
#include <QMainWindow>
#include <QMessageBox>

namespace Ui {
class MainWindow;
}

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

protected slots:
    void newFile();//メニュー Newが押されたとき用
    void openFile();//メニュー Openが押されたとき用

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);
    
    //New、Openの各tiriggeredシグナルを捕捉
    connect(ui->action_New, SIGNAL(triggered()), this, SLOT(newFile()));
    connect(ui->action_Open, SIGNAL(triggered()), this, SLOT(openFile()));
}

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

void MainWindow::newFile()
{
    QMessageBox msgBox(this);
    msgBox.setText("New! clicked!");
    msgBox.exec();
}

void MainWindow::openFile()
{
    QMessageBox msgBox(this);
    msgBox.setText("Open! clicked!");
    msgBox.exec();
}

はい簡単ですね。これらを実行すると以下のようになります。(QAction リファレンス)

(初期画面 Alt+FまたはFileをクリックしたところ)



(Newをクリック、またはAlt+Nを押したところ)


以上です。

※補足 自分で書く場合//---で囲ってある部分のように記述してください。
#include <QtCore/QVariant>
#include <QtGui/QAction>
#include <QtGui/QApplication>
#include <QtGui/QButtonGroup>
#include <QtGui/QHeaderView>
#include <QtGui/QMainWindow>
#include <QtGui/QMenu>
#include <QtGui/QMenuBar>
#include <QtGui/QStatusBar>
#include <QtGui/QToolBar>
#include <QtGui/QWidget>

QT_BEGIN_NAMESPACE

class Ui_MainWindow
{
public:
    QAction *action_New;
    QAction *action_Open;
    QAction *action_Close;
    QWidget *centralWidget;
    QMenuBar *menuBar;
    QMenu *menuFile;
    QToolBar *mainToolBar;
    QStatusBar *statusBar;

    void setupUi(QMainWindow *MainWindow)
    {
        if (MainWindow->objectName().isEmpty())
            MainWindow->setObjectName(QString::fromUtf8("MainWindow"));
        MainWindow->resize(400, 300);


//↓----------------------------------------------------------------------
        action_New = new QAction(MainWindow);
        action_New->setObjectName(QString::fromUtf8("action_New"));
        action_Open = new QAction(MainWindow);
        action_Open->setObjectName(QString::fromUtf8("action_Open"));
        action_Close = new QAction(MainWindow);
        action_Close->setObjectName(QString::fromUtf8("action_Close"));
//↑----------------------------------------------------------------------


        centralWidget = new QWidget(MainWindow);
        centralWidget->setObjectName(QString::fromUtf8("centralWidget"));
        MainWindow->setCentralWidget(centralWidget);


//↓----------------------------------------------------------------------
        menuBar = new QMenuBar(MainWindow);
        menuBar->setObjectName(QString::fromUtf8("menuBar"));
        menuBar->setGeometry(QRect(0, 0, 400, 26));
        menuFile = new QMenu(menuBar);
        menuFile->setObjectName(QString::fromUtf8("menuFile"));
//↑----------------------------------------------------------------------


        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);


//↓----------------------------------------------------------------------
        menuBar->addAction(menuFile->menuAction());
        menuFile->addAction(action_New);
        menuFile->addAction(action_Open);
//↑----------------------------------------------------------------------


        retranslateUi(MainWindow);

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

    void retranslateUi(QMainWindow *MainWindow)
    {
        MainWindow->setWindowTitle(QApplication::translate("MainWindow", "MainWindow", 0, QApplication::UnicodeUTF8));


//↓----------------------------------------------------------------------
        action_New->setText(QApplication::translate("MainWindow", "&New", 0, QApplication::UnicodeUTF8));
        action_Open->setText(QApplication::translate("MainWindow", "&Open", 0, QApplication::UnicodeUTF8));
        action_Close->setText(QApplication::translate("MainWindow", "&Close", 0, QApplication::UnicodeUTF8));
        menuFile->setTitle(QApplication::translate("MainWindow", "&File", 0, QApplication::UnicodeUTF8));
//↑----------------------------------------------------------------------


    } // retranslateUi

};

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