ROS講座71 Qtを使う3(classの作成)
環境
この記事は以下の環境で動いています。
項目 | 値 |
---|---|
CPU | Core i5-8250U |
Ubuntu | 20.04 |
ROS | Noetic |
Qt | 5.12.8 |
インストールについてはROS講座02 インストールを参照してください。
またこの記事のプログラムはgithubにアップロードされています。ROS講座11 gitリポジトリを参照してください。
ソースコード
プログラム本体
qt_lecture/src/qt_basic4.cpp
#include <QApplication>
#include <QDialog>
#include "qt_mydialog.h"
int main(int argc, char** argv)
{
QApplication app(argc,argv);
QWidget* window = new QWidget;
MainDialog* dialog = new MainDialog(window);
dialog->show();
return app.exec();
}
ライブラリ宣言
qt_lecture/src/qt_mydialog.h
#include <QDialog>
#include <QLabel>
#include <QPushButton>
#include <QLineEdit>
class MainDialog : public QDialog
{
Q_OBJECT
public:
MainDialog(QWidget* parent);
private Q_SLOTS:
void setLabelText();
private:
QLabel* label;
QLineEdit* lineEdit;
QPushButton* setButton;
};
#include <QApplication>
#include <QDialog>
#include "qt_mydialog.h"
int main(int argc, char** argv)
{
QApplication app(argc,argv);
QWidget* window = new QWidget;
MainDialog* dialog = new MainDialog(window);
dialog->show();
return app.exec();
}
#include <QDialog>
#include <QLabel>
#include <QPushButton>
#include <QLineEdit>
class MainDialog : public QDialog
{
Q_OBJECT
public:
MainDialog(QWidget* parent);
private Q_SLOTS:
void setLabelText();
private:
QLabel* label;
QLineEdit* lineEdit;
QPushButton* setButton;
};
ここがQtの一番独特なところです。最初のQ_OBJECT
はこのclassがQtのWidgetとして働けるための記述を追加するためのマクロです。必ずclassの宣言の最初に書きます。
private Q_SLOTS:
も同じようにQtのマクロでSLOTとして使う関数の前に置きます。
ライブラリ実装
#include <QDialog>
#include <QLabel>
#include <QPushButton>
#include <QLineEdit>
#include <QVBoxLayout>
#include "qt_mydialog.h"
MainDialog::MainDialog(QWidget* parent): QDialog(parent)
{
label = new QLabel(tr("empty") );
setButton = new QPushButton(tr("Set") );
lineEdit = new QLineEdit;
connect(setButton, &QPushButton::clicked, this, &MainDialog::setLabelText);
QVBoxLayout* layout = new QVBoxLayout;
layout->addWidget(label);
layout->addWidget(lineEdit);
layout->addWidget(setButton);
setLayout(layout);
}
void MainDialog::setLabelText()
{
QString text = lineEdit->text();
label->setText(text);
}
- 9行目では
MainDialog::MainDialog(QWidget* parent): QDialog(parent)
では基底クラスのコンストラクタを呼んでいます。 - connect関数でGUIのボタンが押されたときにsetLabelText関数が実行されるように設定しています。
CMakeList.txt
以下の2つを追加します。
add_executable(qt_basic4 src/qt_basic4.cpp src/qt_mydialog.cpp)
target_link_libraries(qt_basic4
${catkin_LIBRARIES}
${QT_LIBRARIES}
)
add_executable(qt_basic4 src/qt_basic4.cpp src/qt_mydialog.cpp)
のようにプログラム本体とライブラリの実装のみを追加します。ヘッダファイルは追加してはいけません。
ビルド
cd ~/catkin_ws
catkin build
実行
cd ~/catkin_ws
catkin build
以下のコマンドを打つと下の図のようなウィンドウが表示されます。
各ターミナルごとに実行前にsource ~/catkin_ws/devel/setup.bashを実行する必要があります。
rosrun qt_lecture qt_basic4
【参考】MOCについて
ライブラリの宣言にあったQ_OBJECTなどのマクロは通常のコンパイルのプリプロセッサではなく、もっと複雑なMOC(Meta-Object Compiler)という処理をしています。cmakeでset(CMAKE_AUTOMOC ON)
を入れることでこれが実行されるのですが、通常のc++のビルド処理とは違うためにqt周りでコードエラーを起こすと、通常とは違うMOC関連のエラーが出るので注意が必要です。
参考
Qtプログラミング入門
Dockable panel tutorial
目次ページへのリンク
Author And Source
この問題について(ROS講座71 Qtを使う3(classの作成)), 我々は、より多くの情報をここで見つけました https://qiita.com/srs/items/97b06f7b44a9d24718a2著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .