Название: SQL Widget Mapper Example
Отправлено: magoldnew от Апрель 26, 2013, 22:06
Здравия Переделал пример 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.
Название: Re: SQL Widget Mapper Example
Отправлено: magoldnew от Апрель 27, 2013, 08:53
С утра на свежую голову разобрался: Было: QSqlTableModel *relModel = model->relationModel(surnamesIndex); cmbSurnames->setModel(relModel); cmbSurnames->setModelColumn(relModel->fieldIndex("surnames"));
model->relationModel(namesIndex); cmbNames->setModel(relModel); cmbNames->setModelColumn(relModel->fieldIndex("names"));
Надо: QSqlTableModel *relModel = model->relationModel(surnamesIndex); cmbSurnames->setModel(relModel); cmbSurnames->setModelColumn(relModel->fieldIndex("surnames"));
QSqlTableModel *relModel2 = model->relationModel(namesIndex); cmbNames->setModel(relModel2); cmbNames->setModelColumn(relModel2->fieldIndex("names"));
|