== Overview == This works very much like the `roscreate-pkg` script. It sets up a simple ros package structure and includes a few extra qt files and appropriately configured `CMakeLists.txt` so that you can immediately build a very simple qt gui program. == Layout == * ''ui/main_window.ui'' - very simple qt designer ui with tabs and a dock. * ''resources/image.qrc'' - resource that sets an icon for the window. * ''resources/images/icon.png'' - the icon. * ''src/main_window.cpp'' - configuring the ui with close, help, save/load settings. * ''src/main.cpp'' - where you can find main(). * ''include/_package_name_/main_window.hpp'' - the usual qt pimpl style header for the ui. == Usage == === Creating the Package === Use in the same way as roscreate-pkg. {{{ roscreate-qt-pkg qtest }}} === Building === You should be able to just do `make` immediately and run the resulting binary from the `bin` folder. === Extending the Ui === * Use qt designer to extend your ui (`main_window.ui`) any way you desire. {{{ roscd qtest designer ui/main_window.ui }}} Whenever you make modifications to the ui file, be sure to do a make clean before rebuilding to refresh the ui header. * Fill in auto connected sigslot connections (to buttons etc) in `main_window.hpp/cpp`. === Rosifying === You'll probably want to attach an ros node to the process. There are several ways of doing this, a very example follows. A more integrated way of doing so is to make use of the [[eros_python_tools/roscreate_qt_ros_pkg|roscreate-qt-ros-pkg]] template. {{{ #include <QtGui> #include <QApplication> #include <ros/ros.h> #include <ecl/threads/thread.hpp> // or boost threads if you prefer #include "../include/qkorus/main_window.hpp" class Spinner { public: Spinner() : shutdown_required(false), thread(&Spinner::spin, *this) {} ~Spinner() { shutdown_required = true; thread.join(); } void spin() { ros::Rate loop(10); sleep(1); while ( ros::ok() && !shutdown_required ) { ros::spinOnce(); loop.sleep(); } } private: bool shutdown_required; ecl::Thread thread; // similarly, a boost thread }; /***************************************************************************** ** Main *****************************************************************************/ int main(int argc, char **argv) { ros::init(argc,argv,"qkorus"); ros::NodeHandle node; Spinner spinner; QApplication app(argc, argv); qkorus::MainWindow w; // automatically starts spinning a qgoo node inside w.show(); app.connect(&app, SIGNAL(lastWindowClosed()), &app, SLOT(quit())); int result = app.exec(); return result; } }}}