Probleme avec QSQLTABLEMODEL (Méthode data(const QModelIndex &index, int role)



  • Bonjour,

    Je ne parvient pas à faire fonctionner la méthode data(...). Il semble qu'elle est ignorée à l'exécution. voici mon code,

    merci de votre aide.

    #include "widget.h"
    #include "ui_widget.h"
      
    Widget::Widget(QWidget *parent) :
        QWidget(parent),
        ui(new Ui::Widget)
    {
        ui->setupUi(this);
      
        QString file = "C:\\DIVERS\\bd1.accdb";
               QSqlDatabase mDatabase;
               mDatabase = QSqlDatabase::addDatabase("QODBC");
               QString dataBaseString = "DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};FIL={MS Access};DBQ=" + file;
               mDatabase.setDatabaseName(dataBaseString);
      
               mDatabase.open();
      
                mModele = new QSqlTableModel(this);
               mRequete = new QSqlQuery();
                   mRequete->prepare("SELECT Numero, Nom FROM Compte WHERE Numero > 10 and Numero < 25");
    mRequete->exec();
    mModele->setQuery(*mRequete);  
      
    ui->tableView->setModel(mModele);
      
                   ui->tableView->show();
    }
      
    Widget::~Widget()
    {
        delete ui;
      
                  
        
    QVariant Widget::data ( const QModelIndex & index, int role = Qt::DisplayRole )const
       {
      
          if(role==Qt::BackgroundRole)
          {
            return QColor(Qt::red);
                 }
          return  QVariant();
       }
      
    void Widget::on_pushButton_clicked()
    {
         QModelIndex idx;
        idx = mModele->index(1,1,QModelIndex());
      
        mModele->data(idx,Qt::BackgroundRole);
      
        ui->tableView->setModel(mModele);
      
                       ui->tableView->show();
    }
    


  • @lacombe

    Hi and welcome in devnet forum

    Please use only English in the general forum. For different lanuguages there are specific fora https://forum.qt.io/category/57/french


  • Lifetime Qt Champion

    Hi
    "I can not run the data (...) method. It seems she is ignored at runtime. here is my code,
    Thank you for your help."

    Hi
    Hope you read english ;)
    There seems to be some sort of mix up as
    QVariant Widget::data ( const QModelIndex & index, int role = Qt::DisplayRole )const
    is just a function you added to a QWidget.
    Normally such function would be inside a custom Model but you are using QSqlTableModel
    which already have its own.

    However, its possible to call its setData for a index to set any of the roles ( like Qt::BackgroundRole)
    like you do in

    void Widget::on_pushButton_clicked()
    {
         QModelIndex idx;
        idx = mModele->index(1,1,QModelIndex());  
    //    this reads the variant at idx for that role : 
    QVariant data= mModele->data(idx,Qt::BackgroundRole);
    // this set it
      mModele->setData(idx,  Qt::red, Qt::BackgroundRole);
      ui->tableView->setModel(mModele);  
      ui->tableView->show();
    }
    


  • @lacombe

    mModele->data(idx,Qt::BackgroundRole);
    

    Ca ne fait rien. La methode data() renvoie quelque chose, vous ne faites rien avec ca. Ou bien vous voulez utiliser setData()?

    QVariant Widget::data ( const QModelIndex & index, int role = Qt::DisplayRole )const
       {
            if(role==Qt::BackgroundRole)
          {
            return QColor(Qt::red);
                 }
          return  QVariant();
       }
    

    D'abord la methode data() qui vous interesse appartient a QSqlTableModel et pas a QWidget. Aussi avec return QVariant(); elle ne renvoie rien sauf lorsque role==Qt::BackgroundRole. Utilisez le modele:

    class MySqlTableModel : public QSqlTableModel
    ...
    QVariant MySqlTableModel::data ( const QModelIndex & index, int role = Qt::DisplayRole )const
     {
          if(role==Qt::BackgroundRole)
          {
              return QColor(Qt::red);
          }
          return  QSqlTableModel::data(index, role);
    }
    

    Lisez bien ce que @mrjj a ecrit!



  • Merci beaucoup pour ces renseignements, mais comment fait on pour déclencher la coloration en rouge avec le clic sur le bouton ?
    Comment activer cette méthode ?
    Merci pour votre aide.


  • Lifetime Qt Champion

    "Thank you very much for this information, but how does one trigger the coloring in red with the click of the button?
    How to activate this method?
    Thanks for your help."

    vous utilisez les modles setData

    void Widget::on_pushButton_clicked()
    {
    QModelIndex idx = mModele->index(1,1,QModelIndex()); // assurez-vous que row, col est correct (1,1)
    mModele->setData(idx, Qt::red, Qt::BackgroundRole);
    }


  • Lifetime Qt Champion

    Bonjour,

    La question a été déplacée dans la section française.

    Si vous ne voulez pas réimplémenter QSqlTableModel, le plus simple est d'utiliser QIdentityProxyModel et de retourner rouge pour le rôle Qt::BackgroundRole et les information d'origine pour tout le reste comme démontré dans l'example de code de la documentation.


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.