Russian Qt Forum
Ноябрь 24, 2024, 00:09 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QSqlModel и ёё редактирование  (Прочитано 7616 раз)
Max Payne
Гость
« : Март 12, 2012, 10:56 »

Есть БД Sql на Sqlite, создаю модель  QSqlTableModel и устанавливаю таблицу с базы, после чего вставляю пустую строчку в конце таблицы для добавления новой записи, проблема в том , что при редактировании любой ячейки в таблицы новое значение переносится в последнюю пустую строчку куда перемещается и фокус, подскажите где я ошибся, заранее спасибо .
Код:
Код:
QSqlTableModel * mod2 = new QSqlTableModel(this,dbSql);
mod2->setTable("Animals");
mod2->select();

ui->tableView_2->setModel(mod2);
Строчку вставляю так :
Код:
mod2->insertRow(mod2->rowCount());

Политика редактирования по нажатии кнопки:
Код:
    mod2->select();
    if (mod2->submit()== false)
    {
        QMessageBox::critical(this,tr("Error"), tr(" Erorr ").append(tabM->lastError().text()));
        return;

    }
    mod2->insertRow(mod2->rowCount());

    return;
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Март 12, 2012, 11:00 »

А зачем ты mod2->select(); делаешь перед submit?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Max Payne
Гость
« Ответ #2 : Март 12, 2012, 11:24 »

Так как я могу работать с другой моделью , все модели - это наследники main class... и чтобы работать именно с этой я ее выбираю.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #3 : Март 12, 2012, 11:31 »

Нифига не понял. select - это не выбор модели, а ее резет.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Max Payne
Гость
« Ответ #4 : Март 12, 2012, 12:25 »

Да, точно, но удаление этой строчки ничего не изменяет =/
Записан
Bepec
Гость
« Ответ #5 : Март 12, 2012, 12:29 »

mod2->insertRow(mod2->rowCount());

Перевожу на естественный язык - вставь строку на сааааамое послеееееднеее место.

Даже если тыкал ты на самой первой.
Записан
Max Payne
Гость
« Ответ #6 : Март 12, 2012, 18:18 »

По вашему строк в таблице rowCount() +1 ?
Записан
Bepec
Гость
« Ответ #7 : Март 13, 2012, 07:05 »

Помоему в функции insertRow() передаётся число, указывающее на место, в которое надо вставить отредактированный элемент. Т.е. создать новый элемент с данными от пользователя и вставить его на "N" место.

проблема в том , что при редактировании любой ячейки в таблицы новое значение переносится в последнюю пустую строчку куда перемещается и фокус, подскажите где я ошибся, заранее спасибо .

Прочитай свой вопрос. Осознай. Посмотри на
Цитировать
код редактирования по нажатию клавиш
.

Теперь посмотри на выделенные слова и заметь:
mod2->insertRow(mod2->rowCount()); - это вставка в последнюю строчку
Записан
Max Payne
Гость
« Ответ #8 : Март 14, 2012, 00:40 »

Уважаемый Верес, читать я умею и выделять красным шрифтом не обязательно.
Код:
mod2->insertRow(mod2->rowCount());
это вставка пустой строчки в конец таблицы, я ее не редактирую, это строчка на случай когда пользователь захочет добавить новую запись в таблицу, он записывает в каждую ячейку данные через делегат, и жмет
Код:
mod2->submit();
Она есть всегда - пустая строчка. Я же не могу понять почему при редактировании другой ячейки в таблицы (заполненной, просто редактирование данных в таблице), данные меняются  в заданной ячейке, кроме того , данные переносятся в последнюю строчку  в соответствующем столбце (такой же как и в редактируемой ячейке) и фокус тоже смещается на последнюю пустую ячейку. Верес, либо я Вас не могу понять , либо вы не поняли в чем проблема, кричать в принципе не обязательно. Политика изменений :
Код:
(QSqlTableModel::OnFieldChange)
Записан
Bepec
Гость
« Ответ #9 : Март 14, 2012, 07:00 »

Тьфу.

Умываю руки. Молодец. Тогда где у тебя редактирование ячейки? Где код?

В общем пошёл я отсюда.

PS а для остальных, не тормози - выложи куски кода с ф-циями вставки/редактирования. Полные.

Записан
Max Payne
Гость
« Ответ #10 : Март 17, 2012, 14:35 »

Все редактирование реализовано через делегаты

Код:

QWidget *LineDelegate::createEditor(QWidget *parent,const QStyleOptionViewItem &,
                                                                        const QModelIndex &index) const
{

    QDoubleValidator * dV = new QDoubleValidator(-999999999,99999999,2,parent);
  QWidget *editor;


        switch(typeeditor)
        {
        case TLine:
            {
                QLineEdit *lin = new QLineEdit(parent);
                lin->setReadOnly(true);
                return static_cast<QWidget *>(lin);
            }
        case TCombo:
            {
                QComboBox *cmbox = new QComboBox(parent);
                cmbox->addItem("true");
                cmbox->addItem("false");
                return static_cast<QWidget *>(cmbox);
            }
        case TLine_add:
            {
                QLineEdit *line = new QLineEdit(parent);
                line->setReadOnly(false);
                return static_cast<QWidget *>(line);
            }
        case TLine_html:
            {
                QLineEdit *line = new QLineEdit(parent);
                line->setReadOnly(false);
                return static_cast<QWidget *>(line);
            }
        case TLineInt:
            {
                QLineEdit *line = new QLineEdit(parent);
                line->setValidator(dV);
                line->setReadOnly(false);
                return static_cast<QWidget *>(line);
            }
        case TLine_regInt:
            {
                QLineEdit *line = new QLineEdit(parent);
                line->setValidator(dV);
                //line->setValidator(new QDoubleValidator(-99999999.0,999999999.0, 2,editor));
                line->setReadOnly(false);
                return static_cast<QWidget *>(line);
            }
        case TLabel:
            {
                QLabel *line= new QLabel(parent);
                return static_cast<QWidget *>(line);
            }
        case ComboCl:
            {
                QVariant data = index.model()->data(index, Qt::DisplayRole);
                QComboBox *cbox = new QComboBox(parent);
                for (int i = 0 ; i < lC.size(); i++)
                {
                    cbox->addItem(lC.at(i));
                }
                cbox->addItem(data.toString());

                cbox->view()->setCornerWidget(new QSizeGrip(cbox));
                cbox->setAutoCompletion(true);

                qint32 width = 0;
                QFontMetrics fm(cbox->font());
                for(int i = 0; i < cbox->count(); ++i)
                    width = qMax(fm.width(cbox->itemText(i)), width);
                cbox->view()->setMinimumWidth(width + 10);


                return static_cast<QWidget *>(cbox);
            }
        case ComboCl2:
            {
                QVariant data = index.model()->data(index, Qt::DisplayRole);
                QComboBox *cbox = new QComboBox(parent);
                cbox->setEditable(true);
                for (int i = 0 ; i < lC.size(); i++)
                {
                    cbox->addItem(lC.at(i));
                }
                cbox->addItem(data.toString());
                return static_cast<QWidget *>(cbox);
            }
        case Calendar:
            {
                         QDateEdit *editor = new QDateEdit(parent);
                         editor->setDisplayFormat("dd.MM.yyyy");
                         editor->setCalendarPopup(true);
                         editor->setDate(QDate::currentDate());
                         return editor;
            }


        }
        return editor;

}


Код:
void LineDelegate::setEditorData(QWidget *editor,
                                    const QModelIndex &index) const
{
    QVariant data = index.model()->data(index, Qt::DisplayRole);
        switch(typeeditor)
        {
        case TLine:
            {
                QLineEdit *lin = static_cast<QLineEdit *>(editor);
                lin->setText(data.toString());
                break;
            }
        case TCombo:
            {
                QComboBox *cmbox = static_cast<QComboBox *>(editor);
                if (data.toString()=="true")
                {
                    cmbox->setCurrentIndex(cmbox->findText("true"));
                }
                else
                {
                  cmbox->setCurrentIndex(cmbox->findText("false"));
                }
                break;
            }
        case TLine_add:
            {
                QLineEdit *line = static_cast<QLineEdit *>(editor);
                line->setText(data.toString());
                break;
            }
        case TLine_html:
            {
                QLineEdit *line = static_cast<QLineEdit *>(editor);
                line->setText(data.toString());
                break;
            }
        case TLineInt:
            {
                QLineEdit *line = static_cast<QLineEdit *>(editor);
                line->setText(data.toString());
                break;
            }
        case TLine_regInt:
            {
                QLineEdit *line = static_cast<QLineEdit *>(editor);
                line->setText(data.toString());
                break;
            }
        case TLabel:
            {
                QLabel *line= static_cast<QLabel *>(editor);
                line->setText(data.toString());
                break;
            }
        case ComboCl:
            {
                QComboBox * cbox = static_cast < QComboBox *> (editor);
                QString text = data.toString();
                int ig =0;
                for (int i = 0 ; i < cbox->count() ; i++)
                {
                    QStringList op = cbox->itemText(i).split(" ");
                    if (op.contains(text))
                    {
                        ig = i;
                        break;
                    }

                }
                cbox->setCurrentIndex(ig);
                break;
            }
        case ComboCl2:
            {
                QComboBox * cbox = static_cast < QComboBox *> (editor);
                QString text = data.toString();
                int t = cbox->findText(text);
                cbox->setCurrentIndex(t);
                break;
            }
        case Calendar:
            {
                QDateTimeEdit * date = static_cast < QDateTimeEdit *> (editor);
                date->setDate(QDate::fromString(
                             index.model()->data(index, Qt::EditRole).toString(),
                             "dd.MM.yyyy"));

                break;
            }
        }
}


Код:
void LineDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
                                   const QModelIndex &index) const
{
  QVariant data;
        switch(typeeditor)
        {
         case TLine:
            {
                QLineEdit *lin = static_cast<QLineEdit *>(editor);
                data = lin->text();
                break;
            }
        case TCombo:
            {
                QComboBox *cmbox = static_cast<QComboBox *>(editor);
                if (cmbox->currentText()=="true")
                {
                    cmbox->setCurrentIndex(cmbox->findText("true"));
                    data = "true";
                }
                else
                {
                    cmbox->setCurrentIndex(cmbox->findText("false"));
                    data = "false";
                }
                break;
            }
        case TLine_add:
            {
                QLineEdit *line = static_cast<QLineEdit *>(editor);
                //line->setText(re);
                data = line->text();
                break;
            }
        case TLine_html:
            {
                QLineEdit *line = static_cast<QLineEdit *>(editor);
                QString ret = line->text();
                if(line->text().isEmpty())model->revert();
                else
                {
                    data = line->text();
                    break;
                }
               break;
            }
        case TLineInt:
            {
               QLineEdit *line = static_cast<QLineEdit *>(editor);
               //line->setText(re);
               data = line->text();
               break;
            }
        case TLine_regInt:
            {
                QLineEdit *line = static_cast<QLineEdit *>(editor);
                QString ret = line->text();
                if(line->text().isEmpty())model->revert();
                else
                {
                    data = line->text();
                    break;
                }
               break;
            }
        case TLabel:
            {
                QLabel *line= static_cast<QLabel *>(editor);
                data = line->text();
                break;
            }
        case ComboCl:
            {
                QComboBox * cbox = static_cast < QComboBox *> (editor);
                int t = cbox->currentIndex();
                QString str = cbox->itemText(t);
                QStringList ret = str.split(" ");
                str = ret.first();
                if (str.isEmpty() == true)
                {
                    break;
                }
                data = ret.first();
                break;
            }
        case ComboCl2:
            {
                QComboBox * cbox = static_cast < QComboBox *> (editor);
                int t = cbox->currentIndex();
                QString str = cbox->itemText(t);
                if (str.isEmpty() == true)
                {
                    break;
                }
                data = str;
                break;
            }
        case Calendar:
            {
                QDateTimeEdit * date = static_cast < QDateTimeEdit *> (editor);
                QStringList ret = data.toString().split(".");
                data = date->date().toString("dd.MM.yyyy");
                break;
            }


        }
    model->setData(index, data, Qt::EditRole);
}

Но я думаю проблема не в делегатах, а скорее всего в свойствах модели, я перечитал кучу доков и не могу никак решить эту проблему , политика редактирования
Код:
setEditStrategy(QSqlTableModel::OnFieldChange);

Записан
PavelVX
Гость
« Ответ #11 : Март 22, 2012, 08:08 »

видимо ТС так же как и я переходит на Qt с мс аксеса. Там, если не запретить, внизу всегда будет пустая строчка для внесения новой строки.
ТС, вы путаете понятия места для новой строки и собственно вставку новой строки. То-что вы делаете это ВСТАВКА новой строки, а не места для нее. Поэтому любые изменения после попытки вставки будут идти в новой строке. Со всеми вытекающими ...
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.239 секунд. Запросов: 23.