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

ここがQtの一番独特なところです。最初のQ_OBJECTはこのclassがQtのWidgetとして働けるための記述を追加するためのマクロです。必ずclassの宣言の最初に書きます。
private Q_SLOTS:も同じようにQtのマクロでSLOTとして使う関数の前に置きます。

ライブラリ実装

qt_lecture/src/qt_mydialog.cpp
#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つを追加します。

qt_lecture/CMakeLists.txtに追加
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

実行

以下のコマンドを打つと下の図のようなウィンドウが表示されます。
各ターミナルごとに実行前に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

目次ページへのリンク

ROS講座の目次へのリンク