Преглед на файлове

working on database API and newtail dialog

fiffty-50 преди 4 години
родител
ревизия
9f21fe5c5a

BIN
assets/database/logbook.db


+ 16 - 7
mainwindow.cpp

@@ -33,6 +33,8 @@ MainWindow::MainWindow(QWidget *parent)
     ui->actionSettings->setIcon(QIcon(":/icons/ionicon-icons/settings-outline.png"));
     ui->actionQuit->setIcon(QIcon(":/icons/ionicon-icons/power-outline.png"));
     ui->actionNewFlight->setIcon(QIcon(":/icons/ionicon-icons/airplane-outline.png"));
+    ui->actionAircraft->setIcon(QIcon(":/icons/ionicon-icons/airplane-outline.png"));
+    ui->actionNewAircraft->setIcon(QIcon(":/icons/ionicon-icons/airplane-outline.png"));
 
     // Adds space between toolbar items and actionSetting item
     auto *spacer = new QWidget();
@@ -44,13 +46,7 @@ MainWindow::MainWindow(QWidget *parent)
     // create and show homeWidget
     auto hw = new homeWidget(this);
     ui->stackedWidget->addWidget(hw);
-    ui->stackedWidget->setCurrentWidget(hw);
-
-    // currently working on aircraftWidget
-
-    auto aw = new aircraftWidget(this);
-    ui->stackedWidget->addWidget(aw);
-    ui->stackedWidget->setCurrentWidget(aw);
+    ui->stackedWidget->setCurrentWidget(hw);  
 
 }
 
@@ -111,3 +107,16 @@ void MainWindow::on_actionNewFlight_triggered()
     nf.exec();
     */
 }
+
+void MainWindow::on_actionAircraft_triggered()
+{
+    auto aw = new aircraftWidget(this);
+    ui->stackedWidget->addWidget(aw);
+    ui->stackedWidget->setCurrentWidget(aw);
+}
+
+void MainWindow::on_actionNewAircraft_triggered()
+{
+    auto nt = new NewTail(QString(), sql::createNew,this);
+    nt->show();
+}

+ 4 - 0
mainwindow.h

@@ -58,6 +58,10 @@ private slots:
 
     void on_actionNewFlight_triggered();
 
+    void on_actionAircraft_triggered();
+
+    void on_actionNewAircraft_triggered();
+
 private:
     Ui::MainWindow *ui;
 };

+ 21 - 0
mainwindow.ui

@@ -36,7 +36,9 @@
    </attribute>
    <addaction name="actionHome"/>
    <addaction name="actionLogbook"/>
+   <addaction name="actionAircraft"/>
    <addaction name="actionNewFlight"/>
+   <addaction name="actionNewAircraft"/>
    <addaction name="actionSettings"/>
    <addaction name="actionQuit"/>
   </widget>
@@ -80,6 +82,25 @@
     <string>Ctrl+L</string>
    </property>
   </action>
+  <action name="actionAircraft">
+   <property name="text">
+    <string>Aircraft</string>
+   </property>
+   <property name="toolTip">
+    <string>Show or edit Aircraft</string>
+   </property>
+   <property name="shortcut">
+    <string>Ctrl+A</string>
+   </property>
+  </action>
+  <action name="actionNewAircraft">
+   <property name="text">
+    <string>NewAircraft</string>
+   </property>
+   <property name="toolTip">
+    <string>Add a new aircraft to the database</string>
+   </property>
+  </action>
  </widget>
  <resources/>
  <connections/>

+ 10 - 0
src/database/db.cpp

@@ -22,6 +22,11 @@
 #define DEB(expr) \
     qDebug() << "db ::" << __func__ << "\t" << expr
 
+db::db()
+{
+
+}
+
 db::db(sql::tableName tn, int row_ID)
 {
     switch (tn) {
@@ -90,6 +95,11 @@ db::db(sql::tableName tn, QMap<QString, QString> newData)
     data = newData;
 }
 
+void db::setData(const QMap<QString, QString> &value)
+{
+    data = value;
+}
+
 /*!
  * \brief db::connect connects to the database via the default connection.
  * Can then be accessed globally with QSqlDatabase::database("qt_sql_default_connection")

+ 2 - 0
src/database/db.h

@@ -46,6 +46,8 @@ private:
 
 public:
 
+    db();
+
     db(sql::tableName, int row_ID);
 
     db(sql::tableName, QMap<QString, QString> newData);

+ 172 - 172
src/gui/dialogues/newtail.cpp

@@ -22,7 +22,7 @@
 #define DEB(expr) \
     qDebug() << "NewTail ::" << __func__ << "\t" << expr
 
-//Dialog to be used to edit existing tail
+/*Dialog to be used to edit existing tail
 NewTail::NewTail(aircraft acft, QWidget *parent) :
     QDialog(parent),
     ui(new Ui::NewTail)
@@ -31,139 +31,108 @@ NewTail::NewTail(aircraft acft, QWidget *parent) :
     ui->searchLabel->hide();
     ui->searchLineEdit->hide();
     formFiller(acft);
-}
+}*/
 
-//Dialog to be used to create new tail
-NewTail::NewTail(QString newreg, QWidget *parent) :
+//Dialog to be used to create a new tail
+NewTail::NewTail(QString newreg, sql::editRole edRole, QWidget *parent) :
     QDialog(parent),
     ui(new Ui::NewTail)
 {
     ui->setupUi(this);
+    role = edRole;
+    setupCompleter();
+
     ui->editLabel->hide();
     ui->registrationLineEdit->setText(newreg);
-
-    //creating a QMap<id,searchstring>
-    auto query = QLatin1String("SELECT make||' '||model||'-'||variant, aircraft_id FROM aircraft");
-    auto vector = db::customQuery(query,2);
-    QMap<QString, int> map;
-    for (int i = 0; i < vector.length()-2 ; i += 2){
-        if(vector[i] != QLatin1String("")){
-            map.insert(vector[i],vector[i+1].toInt());
-        }
-    }
-    //creating QStringlist for QCompleter
-    auto cl = new completionList(completerTarget::aircraft);
-
-    aircraftlist = cl->list;
-    idMap = map;
-
-    QCompleter* completer = new QCompleter(aircraftlist,ui->searchLineEdit);
-    completer->setCaseSensitivity(Qt::CaseInsensitive);
-    completer->setCompletionMode(QCompleter::PopupCompletion);
-    completer->setFilterMode(Qt::MatchContains);
-    ui->searchLineEdit->setCompleter(completer);
     ui->searchLineEdit->setStyleSheet("border: 1px solid blue");
     ui->searchLineEdit->setFocus();
 }
 
+//Dialog to be used to edit an existing tail
+NewTail::NewTail(db dbentry, sql::editRole edRole, QWidget *parent) :
+    QDialog(parent),
+    ui(new Ui::NewTail)
+{
+    oldEntry = dbentry;
+    ui->setupUi(this);
+    role = edRole;
+    ui->searchLabel->hide();
+    ui->searchLineEdit->hide();
+    formFiller(dbentry);
+}
 
 NewTail::~NewTail()
 {
     delete ui;
 }
 
-
-/// Slots
-
-void NewTail::on_searchLineEdit_textChanged(const QString &arg1)
+/*!
+ * \brief NewTail::formFiller populates the Dialog with the
+ * information contained in an aircraft object.
+ * \param db - entry retreived from database
+ */
+void NewTail::formFiller(db entry)
 {
-    if(aircraftlist.contains(arg1)){//equivalent to editing finished for this purpose. todo: consider connecing qcompleter activated signal with editing finished slot.
-
-        DEB("Template Selected. aircraft_id is: " << idMap.value(arg1));
-        //call autofiller for dialog
-        formFiller(aircraft(idMap.value(arg1),aircraft::acft));
-        ui->searchLineEdit->setStyleSheet("border: 1px solid green");
-    }else{
-        //for example, editing finished without selecting a result from Qcompleter
-        ui->searchLineEdit->setStyleSheet("border: 1px solid orange");
+    DEB("Filling Form for a/c" << entry);
+    //fill Line Edits
+    auto line_edits = parent()->findChildren<QLineEdit*>();
+    for (const auto& le : line_edits) {
+        QString name = le->objectName();
+        name.chop(8);//remove "LineEdit"
+        QString value = entry.data.value(name);
+        if(!value.isEmpty()){
+            le->setText(value);
+        };
     }
-}
+    //select comboboxes
+    QVector<QString> operation = {entry.data.value("singleengine"),entry.data.value("multiengine")};
+    QVector<QString> ppNumber =  {entry.data.value("singlepilot"),entry.data.value("multipilot")};
+    QVector<QString> ppType =    {entry.data.value("unpowered"),entry.data.value("piston"),
+                                  entry.data.value("turboprop"),entry.data.value("jet")};
+    QVector<QString> weight =    {entry.data.value("light"),entry.data.value("medium"),
+                                  entry.data.value("heavy"),entry.data.value("super")};
 
-void NewTail::on_operationComboBox_currentIndexChanged(int index)
-{
-    if(index != 0){
-        ui->operationComboBox->setStyleSheet("");
-    }
-}
 
-void NewTail::on_ppTypeComboBox_currentIndexChanged(int index)
-{
-    if(index != 0){
-        ui->ppTypeComboBox->setStyleSheet("");
-    }
-}
-
-void NewTail::on_ppNumberComboBox_currentIndexChanged(int index)
-{
-    if(index != 0){
-        ui->ppNumberComboBox->setStyleSheet("");
-    }
+    ui->operationComboBox->setCurrentIndex(operation.indexOf("1")+1);
+    ui->ppNumberComboBox->setCurrentIndex(ppNumber.indexOf("1")+1);
+    ui->ppTypeComboBox->setCurrentIndex(ppType.indexOf("1")+1);
+    ui->weightComboBox->setCurrentIndex(weight.indexOf("1")+1);
 }
 
-void NewTail::on_weightComboBox_currentIndexChanged(int index)
-{
-    if(index != 0){
-        ui->weightComboBox->setStyleSheet("");
-    }
-}
+/// Functions
 
-void NewTail::on_buttonBox_accepted()
+/*!
+ * \brief NewTail::setupCompleter creates a QMap<aircaft_id,searchstring> for auto completion,
+ * obtains a QStringList for QCompleter and sets up search line edit accordingly
+ */
+void NewTail::setupCompleter()
 {
-    DEB("Button Box Accepted.");
-    if(ui->registrationLineEdit->text().isEmpty()){
-        auto nope = new QMessageBox(this);
-        nope->setText("Registration cannot be empty.");
-        nope->show();
-    }else{
-        if(verify()){
-            DEB("Form verified");
-            switch (role) {
-            case sql::createNew:
-                break;
-            case sql::editExisting:
-                break;
-            }
-            //auto acOut = createAircraftFromSelection();
-            createEntry();
-            //commit to database
-            //accept();
-        }else{
-            QMessageBox::StandardButton reply;
-            reply = QMessageBox::question(this, "Warning",
-                                          "Some recommended fields are empty.\n\n"
-                                          "If you do not fill out the aircraft details, "
-                                          "it will be impossible to automatically determine Single/Multi Pilot Times or Single/Multi Engine Time."
-                                          "This will also impact statistics and auto-logging capabilites.\n\n"
-                                          "It is highly recommended to fill in all the details.\n\n"
-                                          "Are you sure you want to proceed?",
-                                          QMessageBox::Yes|QMessageBox::No);
-            if (reply == QMessageBox::Yes)
-            {
-                //auto acOut = createAircraftFromSelection();
-                //commit to database (?)
-                //accept();
-            }
+    auto query = QLatin1String("SELECT make||' '||model||'-'||variant, aircraft_id FROM aircraft");
+    auto vector = db::customQuery(query,2);
+    QMap<QString, int> map;
+    for (int i = 0; i < vector.length()-2 ; i += 2){
+        if(vector[i] != QLatin1String("")){
+            map.insert(vector[i],vector[i+1].toInt());
         }
     }
-}
+    //creating QStringlist for QCompleter
+    auto cl = new completionList(completerTarget::aircraft);
 
-/// Functions
+    aircraftlist = cl->list;
+    idMap = map;
+
+    QCompleter* completer = new QCompleter(aircraftlist,ui->searchLineEdit);
+    completer->setCaseSensitivity(Qt::CaseInsensitive);
+    completer->setCompletionMode(QCompleter::PopupCompletion);
+    completer->setFilterMode(Qt::MatchContains);
+    ui->searchLineEdit->setCompleter(completer);
+}
 
 /*!
  * \brief NewTail::formFiller populates the Dialog with the
  * information contained in an aircraft object.
  * \param ac
- */
+ *
 void NewTail::formFiller(aircraft ac)
 {
     DEB("Filling Form for a/c" << ac);
@@ -207,7 +176,7 @@ void NewTail::formFiller(aircraft ac)
     }else if (ac.super) {
         ui->weightComboBox->setCurrentIndex(4);
     }
-}
+}*/
 
 /*!
  * \brief NewTail::verify A simple check for empty recommended fields in the form
@@ -250,11 +219,52 @@ bool NewTail::verify()
     }
 }
 
+void NewTail::submitForm(sql::editRole edRole)
+{
+    DEB("Creating Database Object...");
+    QMap<QString,QString> newData;
+    //retreive Line Edits
+    auto line_edits = parent()->findChildren<QLineEdit*>();
+
+    for (const auto& le : line_edits) {
+        QString name = le->objectName();
+        name.chop(8);//remove "LineEdit"
+        if(!le->text().isEmpty()){
+            newData.insert(name,le->text());
+        }
+    }
+
+    //prepare comboboxes
+    QVector<QString> operation = {"singlepilot","multipilot"};
+    QVector<QString> ppNumber  = {"singleengine","multiengine"};
+    QVector<QString> ppType    = {"unpowered","piston",
+                                  "turboprop","jet"};
+    QVector<QString> weight    = {"light","medium",
+                                  "heavy","super"};
+
+    newData.insert(operation[ui->operationComboBox->currentIndex()-1],QLatin1String("1"));
+    newData.insert(ppNumber[ui->ppNumberComboBox->currentIndex()-1],QLatin1String("1"));
+    newData.insert(ppType[ui->ppTypeComboBox->currentIndex()-1],QLatin1String("1"));
+    newData.insert(weight[ui->weightComboBox->currentIndex()-1],QLatin1String("1"));
+    //create db object
+    switch (edRole) {
+    case sql::createNew:{
+        auto newEntry = db(sql::tails,newData);;
+        newEntry.commit();
+        break;}
+    case sql::editExisting:
+        oldEntry.setData(newData);
+        oldEntry.update();
+        break;
+    }
+}
+
+
 /*!
  * \brief NewTail::createAircraftFromSelection Creates an aircraft object
  * from the current ui selections
  * \return
- */
+ *
 aircraft NewTail::createAircraftFromSelection()
 {
     auto newacft = aircraft();
@@ -294,89 +304,79 @@ aircraft NewTail::createAircraftFromSelection()
         newacft.heavy = true;
     }
     return newacft;
-}
-
-
-
-
-
-
+}*/
 
-//=============================DB Object ==================================
+/// Slots
 
+void NewTail::on_searchLineEdit_textChanged(const QString &arg1)
+{
+    if(aircraftlist.contains(arg1)){//equivalent to editing finished for this purpose. todo: consider connecing qcompleter activated signal with editing finished slot.
 
+        DEB("Template Selected. aircraft_id is: " << idMap.value(arg1));
+        //call autofiller for dialog
+        formFiller(db(sql::aircraft,idMap.value(arg1)));
+        ui->searchLineEdit->setStyleSheet("border: 1px solid green");
+    }else{
+        //for example, editing finished without selecting a result from Qcompleter
+        ui->searchLineEdit->setStyleSheet("border: 1px solid orange");
+    }
+}
 
-//Dialog to be used to edit existing tail
-NewTail::NewTail(db dbentry, sql::editRole edRole, QWidget *parent) :
-    QDialog(parent),
-    ui(new Ui::NewTail)
+void NewTail::on_operationComboBox_currentIndexChanged(int index)
 {
-    ui->setupUi(this);
-    role = edRole;
-    ui->searchLabel->hide();
-    ui->searchLineEdit->hide();
-    formFiller(dbentry);
+    if(index != 0){
+        ui->operationComboBox->setStyleSheet("");
+    }
 }
 
-/*!
- * \brief NewTail::formFiller populates the Dialog with the
- * information contained in an aircraft object.
- * \param db - entry retreived from database
- */
-void NewTail::formFiller(db entry)
+void NewTail::on_ppTypeComboBox_currentIndexChanged(int index)
 {
-    DEB("Filling Form for a/c" << entry);
-    //fill Line Edits
-    auto line_edits = parent()->findChildren<QLineEdit*>();
-    for (const auto& le : line_edits) {
-        QString name = le->objectName();
-        name.chop(8);//remove "LineEdit"
-        QString value = entry.data.value(name);
-        le->setText(value);
+    if(index != 0){
+        ui->ppTypeComboBox->setStyleSheet("");
     }
-    //select comboboxes
-    QVector<QString> operation = {entry.data.value("singleengine"),entry.data.value("multiengine")};
-    QVector<QString> ppNumber =  {entry.data.value("singlepilot"),entry.data.value("multipilot")};
-    QVector<QString> ppType =    {entry.data.value("unpowered"),entry.data.value("piston"),
-                                  entry.data.value("turboprop"),entry.data.value("jet")};
-    QVector<QString> weight =    {entry.data.value("light"),entry.data.value("medium"),
-                                  entry.data.value("heavy"),entry.data.value("super")};
-
+}
 
-    ui->operationComboBox->setCurrentIndex(operation.indexOf("1")+1);
-    ui->ppNumberComboBox->setCurrentIndex(ppNumber.indexOf("1")+1);
-    ui->ppTypeComboBox->setCurrentIndex(ppType.indexOf("1")+1);
-    ui->weightComboBox->setCurrentIndex(weight.indexOf("1")+1);
+void NewTail::on_ppNumberComboBox_currentIndexChanged(int index)
+{
+    if(index != 0){
+        ui->ppNumberComboBox->setStyleSheet("");
+    }
 }
 
-void NewTail::createEntry()
+void NewTail::on_weightComboBox_currentIndexChanged(int index)
 {
-    DEB("Creating Object...");
-    QMap<QString,QString> newData;
-    //retreive Line Edits
-    auto line_edits = parent()->findChildren<QLineEdit*>();
+    if(index != 0){
+        ui->weightComboBox->setStyleSheet("");
+    }
+}
 
-    for (const auto& le : line_edits) {
-        QString name = le->objectName();
-        name.chop(8);//remove "LineEdit"
-        if(!le->text().isEmpty()){
-            newData.insert(name,le->text());
+void NewTail::on_buttonBox_accepted()
+{
+    DEB("Button Box Accepted.");
+    if(ui->registrationLineEdit->text().isEmpty()){
+        auto nope = new QMessageBox(this);
+        nope->setText("Registration cannot be empty.");
+        nope->show();
+    }else{
+        if(verify()){
+            DEB("Form verified");
+            submitForm(role);
+            accept();
+        }else{
+            QMessageBox::StandardButton reply;
+            reply = QMessageBox::question(this, "Warning",
+                                          "Some recommended fields are empty.\n\n"
+                                          "If you do not fill out the aircraft details, "
+                                          "it will be impossible to automatically determine Single/Multi Pilot Times or Single/Multi Engine Time."
+                                          "This will also impact statistics and auto-logging capabilites.\n\n"
+                                          "It is highly recommended to fill in all the details.\n\n"
+                                          "Are you sure you want to proceed?",
+                                          QMessageBox::Yes|QMessageBox::No);
+            if (reply == QMessageBox::Yes)
+            {
+                submitForm(role);
+                accept();
+            }
         }
     }
-
-    //prepare comboboxes
-    QVector<QString> operation = {"singlepilot","multipilot"};
-    QVector<QString> ppNumber  = {"singleengine","multiengine"};
-    QVector<QString> ppType    = {"unpowered","piston",
-                                  "turboprop","jet"};
-    QVector<QString> weight    = {"light","medium",
-                                  "heavy","super"};
-
-    newData.insert(operation[ui->operationComboBox->currentIndex()-1],QLatin1String("1"));
-    newData.insert(ppNumber[ui->ppNumberComboBox->currentIndex()-1],QLatin1String("1"));
-    newData.insert(ppType[ui->ppTypeComboBox->currentIndex()-1],QLatin1String("1"));
-    newData.insert(weight[ui->weightComboBox->currentIndex()-1],QLatin1String("1"));
-    //create db object
-    auto newObject = db(sql::tails,newData);
-    //DEB("Committing Succesfull: " << newObject.commit());
 }

+ 12 - 7
src/gui/dialogues/newtail.h

@@ -39,10 +39,11 @@ class NewTail : public QDialog
     Q_OBJECT
 
 public:
-    explicit NewTail(aircraft acft, QWidget *parent = nullptr);
-
-    explicit NewTail(QString reg, QWidget *parent = nullptr);
 
+    explicit NewTail(aircraft acft, QWidget *parent = nullptr);
+    //to create new tail from scratch
+    explicit NewTail(QString reg, sql::editRole edRole, QWidget *parent = nullptr);
+    //to edit existing tail
     explicit NewTail(db dbentry, sql::editRole edRole, QWidget *parent = nullptr);
 
     ~NewTail();
@@ -68,15 +69,19 @@ private:
 
     sql::editRole role;
 
-    void formFiller(aircraft);
+    db oldEntry;
+
+    void submitForm(sql::editRole edRole);
+
+    void setupCompleter();
+
+    //void formFiller(aircraft);
 
     void formFiller(db);
 
     bool verify();
 
-    aircraft createAircraftFromSelection();
-
-    void createEntry();
+    //aircraft createAircraftFromSelection();
 
     QStringList aircraftlist;
 

+ 21 - 1
src/gui/widgets/aircraftwidget.cpp

@@ -43,6 +43,7 @@ aircraftWidget::aircraftWidget(QWidget *parent) :
         view->hideColumn(i);
     }
     view->setSortingEnabled(true);
+    view->sortByColumn(0,Qt::AscendingOrder);
     view->show();
 
     connect(ui->tableView->selectionModel(),
@@ -65,10 +66,29 @@ void aircraftWidget::tableView_selectionChanged(const QItemSelection &index, con
     setSelectedAircraft(index.indexes()[0].data().toInt());
     DEB("Selected aircraft with ID#: " << selectedAircraft);
 
-    auto nt = new NewTail(aircraft(selectedAircraft,aircraft::tail),this);
+    auto nt = new NewTail(db(sql::tails,selectedAircraft),sql::editExisting,this);
     //auto nt = new NewTail(db(sql::tails,selectedAircraft),this);
 
     nt->setWindowFlag(Qt::Widget);
     ui->stackedWidget->addWidget(nt);
     ui->stackedWidget->setCurrentWidget(nt);
 }
+
+void aircraftWidget::on_deleteButton_clicked()
+{
+    if(selectedAircraft > 0){
+
+        db::deleteRow("tails","_rowid_",QString::number(selectedAircraft),sql::exactMatch);
+
+        QSqlTableModel *model = new QSqlTableModel;
+        model->setTable("viewTails");
+        model->select();
+        ui->tableView->setModel(model);
+
+
+    }else{
+        auto mb = new QMessageBox(this);
+        mb->setText("No aircraft selected.");
+        mb->show();
+    }
+}

+ 2 - 0
src/gui/widgets/aircraftwidget.h

@@ -29,6 +29,8 @@ public:
 private slots:
     void tableView_selectionChanged(const QItemSelection &index, const QItemSelection &);
 
+    void on_deleteButton_clicked();
+
 private:
     Ui::aircraftWidget *ui;
 };

+ 11 - 4
src/gui/widgets/aircraftwidget.ui

@@ -14,6 +14,12 @@
    <string>Form</string>
   </property>
   <layout class="QGridLayout" name="gridLayout">
+   <item row="0" column="1">
+    <widget class="QStackedWidget" name="stackedWidget">
+     <widget class="QWidget" name="page"/>
+     <widget class="QWidget" name="page_2"/>
+    </widget>
+   </item>
    <item row="0" column="0">
     <widget class="QTableView" name="tableView">
      <property name="sizePolicy">
@@ -24,10 +30,11 @@
      </property>
     </widget>
    </item>
-   <item row="0" column="1">
-    <widget class="QStackedWidget" name="stackedWidget">
-     <widget class="QWidget" name="page"/>
-     <widget class="QWidget" name="page_2"/>
+   <item row="1" column="0">
+    <widget class="QPushButton" name="deleteButton">
+     <property name="text">
+      <string>Delete</string>
+     </property>
     </widget>
    </item>
   </layout>

+ 1 - 1
src/gui/widgets/homewidget.cpp

@@ -59,7 +59,7 @@ void homeWidget::on_pushButton_clicked()
     //aircraft ac3(0,aircraft::acft);
 
     auto ob = db(sql::tails,1);
-    auto nt = new NewTail(ob,this);
+    auto nt = new NewTail("DE-NEU", sql::createNew,this);
     nt->show();