diff options
| -rw-r--r-- | CMakeLists.txt | 3 | ||||
| -rw-r--r-- | main.cpp | 43 | ||||
| -rw-r--r-- | main_window.cpp | 23 | ||||
| -rw-r--r-- | main_window.hpp | 22 | ||||
| -rw-r--r-- | qt_adapter.hpp | 28 |
5 files changed, 78 insertions, 41 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 1d5e0d4..0427ed1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,7 @@ project(msc-scriptie) -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --std=c++11") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --std=c++11 -g3") function(MY_QT5_WRAP_UI outfiles ) set(options) @@ -52,6 +52,7 @@ add_executable(msc-scriptie meta_types.hpp boost_any_to_qvariant.hpp gui_item_delegate.hpp gui_item_delegate.cpp + main_window.hpp main_window.cpp ${qt_sources} main.cpp ) @@ -1,4 +1,5 @@ +#include "main_window.hpp" #include "fusion_model.hpp" #include "qt_adapter.hpp" #include "gui_item_delegate.hpp" @@ -8,12 +9,6 @@ #include <iostream> -#include <QMainWindow> -#include <QHeaderView> -#include <QVBoxLayout> -#include <QApplication> -#include <QMdiArea> - struct Data { std::string name; uint32_t number; @@ -63,35 +58,15 @@ int main() mapping.add_data("nummer2", d2); mapping.add_data("nummer3", d3); - auto&& adapter2 = make_qt_adapter(mapping); - - int argc = 0; - QApplication qapp(argc, nullptr); - - QMainWindow w; - - widget_type<decltype(adapter)>::type widget; - widget.setFixedSize(640, 480); - widget.setModel(adapter.get()); - //widget.show(); - - widget_type<decltype(adapter)>::type widget2; - widget2.setFixedSize(640, 480); - widget2.verticalHeader()->setEnabled(true); - widget2.setModel(adapter2.get()); - //widget2.show(); - - QMdiArea area; - - QVBoxLayout layout; + auto adapter2 = make_qt_adapter(mapping); - layout.addWidget(&widget); - layout.addWidget(&widget2); + MainWindow w; - area.setLayout(&layout); - - w.setCentralWidget(&area); - w.show(); + widget_type<decltype(adapter)>::type widget(adapter); + widget_type<decltype(adapter2)>::type widget2(adapter2); + + w.add_widget(&widget); + w.add_widget(&widget2); - return qapp.exec(); + w.show_and_run(); } diff --git a/main_window.cpp b/main_window.cpp new file mode 100644 index 0000000..65daf3e --- /dev/null +++ b/main_window.cpp @@ -0,0 +1,23 @@ +#include "main_window.hpp" + +MainWindow::MainWindow() +: fake_argc(0) +, qapp(fake_argc, nullptr) +, w() +, area(new QMdiArea()) +, layout(new QVBoxLayout()) +{ + area->setLayout(layout); + + w.setCentralWidget(area); +} + +void MainWindow::add_widget(QWidget* widget) +{ + layout->addWidget(widget); +} + +int MainWindow::show_and_run() { + w.show(); + return qapp.exec(); +} diff --git a/main_window.hpp b/main_window.hpp new file mode 100644 index 0000000..c451bfe --- /dev/null +++ b/main_window.hpp @@ -0,0 +1,22 @@ +#pragma once + +#include <QMainWindow> +#include <QHeaderView> +#include <QVBoxLayout> +#include <QApplication> +#include <QMdiArea> + +struct MainWindow { + + int fake_argc; + QApplication qapp; + QMainWindow w; + QMdiArea* area = new QMdiArea(); + QVBoxLayout* layout = new QVBoxLayout(); + + MainWindow(); + + void add_widget(QWidget* widget); + + int show_and_run(); +};
\ No newline at end of file diff --git a/qt_adapter.hpp b/qt_adapter.hpp index 6e0de17..d19a35c 100644 --- a/qt_adapter.hpp +++ b/qt_adapter.hpp @@ -34,22 +34,38 @@ struct QtModelType<std::map<std::string, V>> template <typename T> struct widget_type { - typedef void type; +// typedef void type; +}; + +template <typename T> +struct widget_type<std::shared_ptr<T>> { + typedef typename T::widget type; }; template <typename T> -struct widget_type<std::unique_ptr<T>> { +struct widget_type<std::shared_ptr<T>&&> +{ typedef typename T::widget type; }; template <typename T> +struct widget_type<std::shared_ptr<T>&> +{ + typedef typename T::widget type; +}; + +template <typename T, typename U> struct QtWidget : public T { GuiItemDelegate delegate; + std::shared_ptr<U> model; - QtWidget(QWidget* parent = nullptr) + QtWidget(std::shared_ptr<U> model, QWidget* parent = nullptr) : T(parent) + , delegate() + , model(model) { + T::setModel(this->model.get()); T::setItemDelegate(&delegate); } }; @@ -67,7 +83,7 @@ template <typename T> struct QtAdapter<T, QAbstractTableModel> : public QAbstractTableModel { typedef QTableView view; - typedef QtWidget<view> widget; + typedef QtWidget<view, QtAdapter<T, QAbstractTableModel>> widget; T model; @@ -111,7 +127,7 @@ struct QtAdapter<T, QAbstractTableModel> : public QAbstractTableModel }; template <typename T> -std::unique_ptr<QtAdapter<T, typename QtModelType<typename T::data_type>::type>> make_qt_adapter(T value) { +std::shared_ptr<QtAdapter<T, typename QtModelType<typename T::data_type>::type>> make_qt_adapter(T value) { typedef QtAdapter<T, typename QtModelType<typename T::data_type>::type> type; - return std::unique_ptr<type>(new type(value)); + return std::make_shared<type>(value); } |
