-
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(); }
-
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 invoid 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(); }
-
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 utilisersetData()
?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 aQSqlTableModel
et pas aQWidget
. Aussi avecreturn QVariant();
elle ne renvoie rien sauf lorsquerole==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!
-
"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);
} -
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.