Здравия
Переделал пример SQL Widget Mapper Example из assista, в один комбобокс подставляются значения по внешнему ключу, добавил второй, вроде в код добавил все что нужно (по аналогии), но во втором комбобоксе значения не отображаются, никак не въеду где копнуть, вот код:
#include <QtWidgets>
#include <QtSql>
#include "window.h"
//! [Set up widgets]
Window::Window(QWidget *parent)
: QWidget(parent)
{
setupModel();
lblSurnames = new QLabel(tr("&Surname:"));
cmbSurnames = new QComboBox();
lblNames = new QLabel(tr("&Name:"));
cmbNames = new QComboBox();
nextButton = new QPushButton(tr("&Next"));
previousButton = new QPushButton(tr("&Previous"));
lblSurnames->setBuddy(cmbSurnames);
lblNames->setBuddy(cmbNames);
//! [Set up widgets]
//! [Set up the mapper]
QSqlTableModel *relModel = model->relationModel(surnamesIndex);
cmbSurnames->setModel(relModel);
cmbSurnames->setModelColumn(relModel->fieldIndex("surnames"));
model->relationModel(namesIndex);
cmbNames->setModel(relModel);
cmbNames->setModelColumn(relModel->fieldIndex("names"));
mapper = new QDataWidgetMapper(this);
mapper->setModel(model);
mapper->setItemDelegate(new QSqlRelationalDelegate(this));
mapper->addMapping(cmbSurnames, surnamesIndex);
mapper->addMapping(cmbNames, namesIndex);
//! [Set up the mapper]
//! [Set up connections and layouts]
connect(previousButton, SIGNAL(clicked()),
mapper, SLOT(toPrevious()));
connect(nextButton, SIGNAL(clicked()),
mapper, SLOT(toNext()));
connect(mapper, SIGNAL(currentIndexChanged(int)),
this, SLOT(updateButtons(int)));
QGridLayout *layout = new QGridLayout();
layout->addWidget(lblSurnames, 0, 0, 1, 1);
layout->addWidget(cmbSurnames, 0, 1, 1, 1);
layout->addWidget(lblNames, 1, 0, 1, 1);
layout->addWidget(cmbNames, 1, 1, 1, 1);
layout->addWidget(previousButton, 0, 2, 1, 1);
layout->addWidget(nextButton, 1, 2, 1, 1);
setLayout(layout);
setWindowTitle(tr("SQL Widget Mapper"));
mapper->toFirst();
}
//! [Set up connections and layouts]
//! [Set up the main table]
void Window::setupModel()
{
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setDatabaseName("eobd");
db.setUserName("root");
db.setPassword("1q2w");
if (!db.open()) {
QMessageBox::critical(0, qApp->tr("Cannot open database"),
qApp->tr("Unable to establish a database connection.\n"
"Click Cancel to exit."), QMessageBox::Cancel);
return;
}
QSqlQuery myQuery;
myQuery=QSqlQuery(db);
if (!myQuery.exec("SELECT people_pk, surnames_fk, names_fk, patronymics_fk FROM people")) {
qDebug() << "query error" << myQuery.lastQuery() << myQuery.lastError();
}
model = new QSqlRelationalTableModel(this);
model ->setTable("people");
model ->setEditStrategy(QSqlTableModel::OnManualSubmit);
//! [Set up the main table]
//! [Set up the surnames table]
if (!myQuery.exec("SELECT surnames_pk, surnames FROM surname")) {
qDebug() << "query error" << myQuery.lastQuery() << myQuery.lastError();
}
surnamesIndex = model->fieldIndex("surnames_fk");
model->setRelation(surnamesIndex,
QSqlRelation("surname", "surnames_pk", "surnames"));
model->select();
//! [Set up the surnames table]
//! [Set up the names table]
if (!myQuery.exec("SELECT names_pk, names FROM name")) {
qDebug() << "query error" << myQuery.lastQuery() << myQuery.lastError();
}
namesIndex = model->fieldIndex("names_fk");
model->setRelation(namesIndex,
QSqlRelation("name", "names_pk", "names"));
model->select();
}
/*
query.exec("SELECT patronymics_pk, patronymics FROM patronymics");
*/
//! [Set up the names table]
//!
//! [Slot for updating the buttons]
void Window::updateButtons(int row)
{
previousButton->setEnabled(row > 0);
nextButton->setEnabled(row < model->rowCount() - 1);
}
//! [Slot for updating the buttons]
P.S. А если у кого-то есть готовая БД на QT был бы вообще премного благодарен, подходящий исходный код гораздо проще разобрать чем аналоги с виртуальными базами из assista, задолбался уже лазить по ассисту и интернету
неделю собирал драйвер, еще 4 дня шаманил с кодом чтобы хоть что-то выудить из БД
Не являюсь спецом ни в QT, ни в C++, просто хочу свои существующие БД из ACCESS+VBA перевести на бесплатные рельсы QT+MYSQL.