PDA

View Full Version : QDataWidgetMapper setting own model index



AlGaN
16th February 2010, 16:34
Hi,

I have a SQL table model that maps RFID EPC codes to table indexes like this:



enum
{
RFID_ID = 0,
RFID_EPC = 1,
RFID_Name = 2,
};

class RfidTagForm : public QDialog
{
Q_OBJECT

public:
RfidTagForm(int id, QWidget* parent = 0);

private slots:
void addTag();
void deleteTag();

private:
QSqlTableModel* mTableModel;
QDataWidgetMapper* mMapper;

QLabel* mEPCLabel;
QLabel* mNameLabel;
QLineEdit* mEPCEdit;
QLineEdit* mNameEdit;

QPushButton* mFirstButton;
QPushButton* mPreviousButton;
QPushButton* mNextButton;
QPushButton* mLastButton;
QPushButton* mAddButton;
QPushButton* mDeleteButton;
[...]
};




RfidTagForm::RfidTagForm(int id, QObject* parent) : QDialog(parent)
{
mEPCEdit = new QLineEdit;

[...]
mTableModel = new QSqlTableModel(this);
mTableModel->setTable("rfidtags");
mTableModel->setSort(RFID_ID, Qt::AscendingOrder);
mTableModel->select();

mMapper = new QDataWidgetMapper(this);
mMapper->setSubmitPolicy(QDataWidgetMapper::AutoSubmit);
mMapper->setModel(mTableModel);
mMapper->addMapping(mEPCEdit, RFID_EPC);
mMapper->addMapping(mNameEdit, RFID_Name);
[...]

if (id != -1)
{
for (int row = 0; row < mTableModel->rowCount(); ++row)
{
QSqlRecord record = mTableModel->record(row);
if (record.value(RFID_ID).toInt() == id)
{
mMapper->setCurrentIndex(row);
}
}
}
else
{
mMapper->toFirst();
}

connect(mFirstButton, SIGNAL(clicked()), mMapper, SLOT(toFirst()));
connect(mPreviousButton, SIGNAL(clicked()), mMapper, SLOT(toPrevious)));
connect(mNextButton, SIGNAL(clicked()), mMapper, SLOT(toNext()));
connect(mLastButton, SIGNAL(clicked()), mMapper, SLOT(toLast()));
connect(mAddButton, SIGNAL(clicked()), this, SLOT(addTag()));
connect(mDeleteButton, SIGNAL(clicked()), this, SLOT(deleteTag()));

[...]
// set up the UI stuff...

}


void RfidTagForm::addTag()
{
int row = mMapper->currentIndex();
mMapper->submit();
mTableModel->insertRow(row);
mMapper->setCurrentIndex(row);

mEPCEdit->clear();
mNameEdit->clear();
}

void RfidTagForm::deleteTag()
{
int row = mMapper->currentIndex();
mTableModel->removeRow(row);
mMapper->submit();
mMapper->setCurrentIndex(qMin(row, mTableModel->rowCount() - 1));
}


If the user now edits a new tag data and inserts a new RFID EPC Hex code (EPC is a long hex number to identify the tag) this should be converted to integer and taken as the record's ID for the table. But as far as I understand, QDataWidgetMapper sets the index automatically if it is set to AutoSubmit.

So is there any possibility to take influence on the data record ID when adding/deleting data records from the table? Or do I have to make this submit manual (ie set ManualSubmit and implement the slots for QDataWidgetMapper myself), but this does not solve my problem that I don't know the data record's index before the user has not edited the EPC line edit so that I can calculate the hex to integer record ID.

Thanks for any hint on this,
AlGaN