Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Спозиционировать на запись в QSqlTableModel
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Модель/Представление
JohnZ
Всем Здравствовать !

Есть такой класс на диалоге, для обслуживания динам-х форм.

#ifndef FPFORM_H
#define FPFORM_H

#include <QtGui>
#include <QFlags>
#include <QDialog>
#include <QVector>
#include <QBitArray>
#include <QWidget>

#include "domitem.h"
#include "dommodel.h"
#include "mdichild.h"

//     "Лишнее"  удалено  !!!

class fpForm : public QDialog
{
    Q_OBJECT

public:

    fpForm(DomItem *item, MdiChild *parent = 0, Qt::WindowFlags f = 0);
    ~fpForm();

    void preview();
    bool initForm(int fpFlags = 0, int fpCmd = 0); // Q_INVOKABLE

    void setExtModel(QSqlTableModel *extmodel);

protected:

    bool createView();

    bool isWContainer(QObject *wo);
    void closeEvent(QCloseEvent *event);
    void keyPressEvent ( QKeyEvent * event );

    void parseForm(QObject *wo);
    bool loadForm(DomItem *item = 0);

private:

        QTableView *view;  // Если есть, тогда Список, иначе Форма

        fpForm *DlgForm;    // Форма редактирования записи

        QSqlTableModel     *model;

        QDataWidgetMapper  *mapper;

        QWidget *formUI;

        MdiChild *MdiParent;

        QVector<QObject *> formWidgets;
};

#endif // FPFORM_H


Есть 2 объекта этого класса, загруженных динамически последовательно,
но первый это список, т.е. таблица из БД, а второй форма редактирования
выбранной записи, которая находится в указателе *DlgForm.
В смысле загруженная Форма в указателе ;-)
Модель у них ес-сно одна на двоих, т.к. список устанавливает модель форме через
void setExtModel(QSqlTableModel *extmodel);
Мапер связывает поля модели в объекте формы. (Один класс на форму и список !)

mapper = new QDataWidgetMapper(this);
mapper->setModel(model);
......................................................
aStr = QString("fld_%1").arg(Idd);
mapper->addMapping((QLineEdit *)wo, model->fieldIndex(aStr));
mapper->toFirst();

Вызов формы из объекта списка тривиален
void fpForm::keyPressEvent ( QKeyEvent * event )
{
    switch(event->key())
    {
        case Qt::Key_Return:
             if (DlgForm)
             {
                 DlgForm->exec();
                 event->accept();
                 return;
             }
             break;
       case Qt::Key_Space:   // НЕ ЛОВИТ
             if (DlgForm)
             {
                 DlgForm->view();
                 event->accept();
                 return;
             }
             break;

      ........................................


Трабл-ема в том, что форма всегда показывает ПЕРВУЮ запись, а не выбранную в ( QTableView *view; )
Я предполагал, что указателя на модель, для определения выбора mapper-у будет достаточно :(
Помогите PLZ спозиционировать в форму выбранную запись ...

И попутно, в void fpForm::keyPressEvent ( QKeyEvent * event ) не отлавливается почему-то клавиша пробел ?!
Кто-либо сталкивался ? QT 4.5.3.
lanz
Чтобы спозиционировать:
http://qt-project.org/doc/qt-5/qabstractit...w.html#scrollTo

А чтобы поместить в виджет нужный индекс:
http://qt-project.org/doc/qt-5/qdatawidget...rrentModelIndex
JohnZ
lanz, спасибо, заработало !
А по-поводу any-key (пробел) подскажет-кто ?

Новые проблемы. Продолжу здесь, да-бы не плодить тем.

1. Когда находимся в форме редактирования записи, нажатие любой из кнопок
диалога ( Ок || Cancel ) обновляет view. Т.е. QTableView не видит между ними различия.
Как победить ?

2.
        model = new QSqlTableModel(this);   //  this - это fpForm, объявление выше
        model->setTable(aStr);
        model->setEditStrategy(QSqlTableModel::OnManualSubmit);
        model->select();


При установленной model->setEditStrategy(QSqlTableModel::OnManualSubmit); при
закрытии формы в консоль вываливает "QSqlQuery::value: not positioned on a valid record" .
Во-первых в диалоге выбранная запись, т.е. позиционирование есть ! (спасибо lanz)
Во-вторых обновление записи я пока нигде не ставил, т.е. ещё до этого не дошёл.
Откуда и почему это может вылазить ? Как победить ?
3. По реакции на "пробел" - он перехватывается загруженным QTableView и далее
не выпускается. void fpForm::keyPressEvent на форме его действительно не видит.
Можно-ли "упросить" QTableView отдавать клавишу пробел ?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2020 IPS, Inc.