2012年4月3日火曜日

( Qt C++ )ツールバーに項目をセットする


最近、風邪をこじらせてしまって体が関節痛でキッツイです。いつもはすぐ直るのですが今回は油断しました。やはり初期の段階で薬を飲んでおくべきでした。まぁ今更なげいてもしかたがありませんが...


はい、それでは表題の件やっていきます。
ちなみにツールバーって何かというと

の赤枠線内の部分です。よく使いますよね。

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

ではさっそくやっていきます。

まず新規プロジェクトを作成してください。(Qt ウィジットプロジェクトのQt GUI アプリケーションを選択し、適当な名前をつけてください。)
そうするとツールバーも既に配置されたMainWindowが表示されると思います。これで下準備は終了です。

では次にデザイナ下の方にあるアクションエディタを使用します。新規作成を押し、"Open", "Close", "Cut"のアクションを作成してください。ちなみにCutアクションは文字ではなくアイコンをセットします。

作成後、これらのアクションを順にツールバーにドラッグ&ドロップして配置していきます。
(ちなみにセパレータも配置できます。ツールバー上で右クリックし、適宜配置してください。)

 これで配置完了です。それではここからコード書きに入ります。

(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_actionOpen_triggered();
    void CloseClicked();
    void CutClicked();

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);
    connect(ui->actionClose, SIGNAL(triggered()), this, SLOT(CloseClicked()));
    connect(ui->actionCut, SIGNAL(triggered()), this, SLOT(CutClicked()));
}

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

void MainWindow::on_actionOpen_triggered()
{
    ui->label->setText("Open Click");
}

void MainWindow::CloseClicked()
{
    ui->label->setText("Close Click");
}

void MainWindow::CutClicked()
{
    ui->label->setText("Cut Click");
}


はい簡単ですね。
Openはon_actionOpen_triggeredでどこにもconnectせずにシグナルを補足しています。この辺りは”Qtをはじめよう"に書いてあったはずなのでそちらを参照してください。CloseとCutについてはコンストラクタで両方ともconnectしています。

これらを実行すると以下のようになります。
(起動時画面)

(ツールバーのOpenを押したとき)

以上です。


※補足
デザイナやアクションエディタを使用せず自分で手書きする場合は以下のコードを参考にしてください。(Qt Createrが吐いたコードです。)
#include <QtCore/QVariant>
#include <QtGui/QAction>
#include <QtGui/QApplication>
#include <QtGui/QButtonGroup>
#include <QtGui/QHeaderView>
#include <QtGui/QLabel>
#include <QtGui/QMainWindow>
#include <QtGui/QMenuBar>
#include <QtGui/QStatusBar>
#include <QtGui/QToolBar>
#include <QtGui/QWidget>

QT_BEGIN_NAMESPACE

class Ui_MainWindow
{
public:
    QAction *actionOpen;
    QAction *actionClose;
    QAction *actionCut;
    QWidget *centralWidget;
    QLabel *label;
    QMenuBar *menuBar;
    QToolBar *mainToolBar;
    QStatusBar *statusBar;

    void setupUi(QMainWindow *MainWindow)
    {
        if (MainWindow->objectName().isEmpty())
            MainWindow->setObjectName(QString::fromUtf8("MainWindow"));
        MainWindow->resize(400, 300);
        actionOpen = new QAction(MainWindow);
        actionOpen->setObjectName(QString::fromUtf8("actionOpen"));
        actionClose = new QAction(MainWindow);
        actionClose->setObjectName(QString::fromUtf8("actionClose"));
        actionCut = new QAction(MainWindow);
        actionCut->setObjectName(QString::fromUtf8("actionCut"));
        QIcon icon;
        icon.addFile(QString::fromUtf8("../toolbar-build-desktop-Qt_4_7_4_for_Desktop_-_MSVC2008__Qt_SDK__Debug/trimming_img.gif"), QSize(), QIcon::Normal, QIcon::Off);
        icon.addFile(QString::fromUtf8("../GameProgram/SettingFiles/CharacterImage/life.png"), QSize(), QIcon::Selected, QIcon::On);
        actionCut->setIcon(icon);
        centralWidget = new QWidget(MainWindow);
        centralWidget->setObjectName(QString::fromUtf8("centralWidget"));
        label = new QLabel(centralWidget);
        label->setObjectName(QString::fromUtf8("label"));
        label->setGeometry(QRect(79, 100, 221, 20));
        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);

        mainToolBar->addAction(actionOpen);
        mainToolBar->addSeparator();
        mainToolBar->addAction(actionClose);
        mainToolBar->addSeparator();
        mainToolBar->addAction(actionCut);
        mainToolBar->addSeparator();

        retranslateUi(MainWindow);

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

    void retranslateUi(QMainWindow *MainWindow)
    {
        MainWindow->setWindowTitle(QApplication::translate("MainWindow", "MainWindow", 0, QApplication::UnicodeUTF8));
        actionOpen->setText(QApplication::translate("MainWindow", "Open", 0, QApplication::UnicodeUTF8));
        actionClose->setText(QApplication::translate("MainWindow", "Close", 0, QApplication::UnicodeUTF8));
        actionCut->setText(QApplication::translate("MainWindow", "Cut", 0, QApplication::UnicodeUTF8));
        label->setText(QApplication::translate("MainWindow", "\343\201\223\343\201\223\343\201\253\350\241\250\347\244\272\343\201\225\343\202\214\343\201\276\343\201\231\343\200\202", 0, QApplication::UnicodeUTF8));
    } // retranslateUi

};

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