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

}}}