環境
この記事は以下の環境で動いています。
項目 | 値 |
---|---|
CPU | Core i5-8250U |
Ubuntu | 20.04 |
ROS | Noetic |
Qt | 5.12.8 |
インストールについてはROS講座02 インストールを参照してください。
またこの記事のプログラムはgithubにアップロードされています。ROS講座11 gitリポジトリを参照してください。
ソースコード
プログラム本体
#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
実行
以下のコマンドを打つと下の図のようなウィンドウが表示されます。
各ターミナルごとに実行前に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