crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Спозиционировать на запись в QSqlTableModel, Найти индекс записи
JohnZ
  опции профиля:
сообщение 29.9.2014, 18:31
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 139
Регистрация: 19.7.2014
Пользователь №: 4190

Спасибо сказали: 10 раз(а)




Репутация:   0  


Всем Здравствовать !

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

#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.

Сообщение отредактировал JohnZ - 29.9.2014, 18:35
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 29.9.2014, 18:52
Сообщение #2


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


Чтобы спозиционировать:
http://qt-project.org/doc/qt-5/qabstractit...w.html#scrollTo

А чтобы поместить в виджет нужный индекс:
http://qt-project.org/doc/qt-5/qdatawidget...rrentModelIndex
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
JohnZ
  опции профиля:
сообщение 29.9.2014, 19:14
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 139
Регистрация: 19.7.2014
Пользователь №: 4190

Спасибо сказали: 10 раз(а)




Репутация:   0  


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 отдавать клавишу пробел ?

Сообщение отредактировал JohnZ - 1.10.2014, 16:37
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.3.2024, 13:22