Qt (3) QtDesignerとuiファイルを調べる
シグナルとスロットと追加する
では、ボタンをクリックされた時に、アプリケーションを終了するように定義しましょう。
以下がその例です。
[sample.cpp]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| #include "QMessageBox"
#include "ui_test.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QWidget *widget = new QWidget;
Ui::Form ui;
ui.setupUi(widget);
QPushButton* ui_findButton = qFindChild<QPushButton*>(widget, "pushButton");
if(ui_findButton!=NULL){
widget->connect(ui_findButton, SIGNAL(clicked()),
qApp, SLOT(closeAllWindows()));
} else {
QMessageBox::information (NULL,"Nothing","Nothing pushButton.");
}
widget->show();
return app.exec();
}
|
11行目で、画面から"pushButton"というウィジェット名からQPushButtonのオブジェクトを探してきます。
その探したQPushButtonのシグナル"clicked"に、スロット"closeAllWindows"を割り当てています。
実際に、実行してクリックしてみてください。画面が閉じて、終了したと思います。
このように、すでにあるスロットやシグナルであれば、このように画面イメージをQtDesignerで作成して
簡単に制御までできます。
しかし、ほとんどの場合は、個別のスロットを定義したいものです。そうしたとき、メタを使わなければなりません。
使うためにmocで、ちゃんと認識できるように継承クラスを設けて、ヘッダとクラスに分けてあげます。
では、QWidgetを継承したクラスを作って、個別のスロットを用意してみましょう。
前回の記事と同じようにサンプルファイルを3つ準備します。
- sample.cpp
-- mainルーチンです。
- mainwindow.h
-- QWidget継承クラスヘッダです。
- mainwindow.cpp
-- QWidget継承クラスソースです。
では、それぞれのソースコードを見てみましょう。
[mainwindow.h]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| #ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include "ui_test.h"
#include <QtGui>
class MainWindow : public QWidget
{
Q_OBJECT
public:
MainWindow();
private slots:
void on_pushButton_clicked();
private:
Ui::Form ui;
};
#endif
|
15行目が、スロットの定義です。
名前に注意してください。
"on_ウィジェット名_シグナル名"となっていることに注意しなければなりません。
スロット名は、QtDesignerで指定することもできますが、何も指定がない場合は、上記の法則で、デフォルトのスロットを定義できます。
この定義名で、connect処理を記述しなくて良くなります。
[mainwindow.cpp]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| #include "QMessageBox"
#include "mainwindow.h"
MainWindow::MainWindow()
{
ui.setupUi(this);
setWindowTitle(tr("SampleWindow"));
}
void MainWindow::on_pushButton_clicked()
{
QMessageBox::information (NULL,"Click","Click Click!!");
}
|
6行目で、自動で作成されたクラスをダイレクトに使用していたときと同じように、このウィジェット上にQtDesigneで定義した画面を貼り付けます。
12行目からは、ボタンがクリックされたときの動作です。
ここでは、メッセージボックスを表示するようにしています。
[mainwindow.cpp]
1
2
3
4
5
6
7
8
9
10
11
| #include <QApplication>
#include "mainwindow.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MainWindow mainWin;
mainWin.show();
return app.exec();
}
|
ここは、説明は必要ないかと思います。単純にアプリケーションを作って、画面を作って表示だけです。
さあ、実行してみましょう。
以下のように、メッセージボックスが表示したと思います。
ここでは、単純な継承を用いましたが、Ui::Formを同時に多重継承させても同じようにできます。
内部属性として持つか、継承元(親)として持つかの違いです。
コメントをどうぞ