Seite 1 von 1

MySql und boolche Werte in der Datenbank

Verfasst: 5. Juli 2012 20:23
von mini
Hi,
ich habe via ODBC Zugriff auf eine MySQL-Datenbank. In der Tabelle gibt es Spalten welche boolche Werte enthalten. Beim Nutzung des QSQlTableModel / TableView werden diese als Zahl dargestellt und lassen sich über eine Spinbox editieren. Ich möchte die Darstellung und das Editieren aber über eine Checkbox.
Nachdem was ich gelesen habe, muß ich dazu QSqlTableModel ableiten und die Funktionen :data und :setdata überschreiben um die in der Datenbank als tinyint abgespeicherten Werte nach bool zu konvertieren. Mit :data funktioniert das, aber ich habe keine Ahnung, wie ich das mit :setdata machen soll?
Wo sollen die Daten hingespeichert werden?

Code: Alles auswählen

MitgliederListModel::MitgliederListModel(QObject *parent , QSqlDatabase db):
        QSqlTableModel(parent,db)
{
}


QVariant MitgliederListModel::data(const QModelIndex &index, int role) const
{
    /*! Data holt die Daten aus dem Model und sendet sie an den View. Da MySQL über ODBC bool-Daten
        als int schickt, gibt es eine falsche Darstellung im View (SpinBox statt Checkbox).*/
    if(!index.isValid())
        return QVariant();

    switch(index.column())
    {
    case 7:
    case 8:
        {
            //Daten holen
            QVariant x = QSqlTableModel::data(index,role);
            //Konvertieren
            if (x.toInt()==0)  
                return QVariant(false);
            else
                return QVariant(true);
        }
        break;
    default:
        return QSqlTableModel::data(index, role);
    }
}

bool MitgliederListModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
    // validate the index and that row and column are inside the given borders...
    if(!index.isValid() || (this->columnCount() <= index.row()) || (this->columnCount() <= index.column()))
        return false;

     switch(index.column())
    {
    case 7:  
    case 8:
         /* Wie kommen die Daten ins model???????????????*/
        return true;   /*! so tun wie editiert */
        break;

    default:
        return false;  // nichts wurde editiert

        /*! Signal fehlt nocht */
    }
}


Vielen Dank
mini

Re: MySql und boolche Werte in der Datenbank

Verfasst: 8. Juli 2012 09:14
von mini
Danke, war ein guter Tip und funktioniert.

Allerdings kann ich nur den Stauts von 2 oder 3 Checkboxen ändern, dann baut sich der tableView neu auf und die betreffenden Spalten sind leer.
Kann es sein, daß es damit zusammenhängt, daß openPersistentEditor nur im Konstruktor aufgerufen wird, und damit nicht beim nächsten Neuzeichnen?

Code: Alles auswählen


   /*! Delegate setzen */ 
    CheckBoxDelegate* pCheckBoxDelegate = new CheckBoxDelegate(tableView);
    Q_CHECK_PTR( pCheckBoxDelegate);
    for(int j =6; j<=8; j++ )
    {
        tableView->setItemDelegateForColumn(j,pMitgliederListeDelegate);
        // Make the combo boxes always displayed.
        for ( int i = 0; i < model->rowCount(); ++i )
        {
            tableView->openPersistentEditor( model->index(i, j) );
        }
    }


Re: MySql und boolche Werte in der Datenbank

Verfasst: 10. Juli 2012 15:33
von mini
Problem geklärt. Von Model das Signal "dataChanged" ausgewertet und dort nochmal "openPersistentEditor" aufgerufen.