Russian Qt Forum

Qt => Базы данных => Тема начата: magoldnew от Апрель 26, 2013, 22:06



Название: 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"));