summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt3
-rw-r--r--main.cpp43
-rw-r--r--main_window.cpp23
-rw-r--r--main_window.hpp22
-rw-r--r--qt_adapter.hpp28
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
)
diff --git a/main.cpp b/main.cpp
index 3e9307d..380a3a9 100644
--- a/main.cpp
+++ b/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);
}