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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QDataWidgetMapper и несколько QCombobox  (Прочитано 2576 раз)
serzh272
Новичок

Offline Offline

Сообщений: 1


Просмотр профиля
« : Январь 21, 2020, 04:28 »

Здравствуйте! Столкнулся с проблемой - при использовании QDataWidgetMapper в модели QSqlRelationalTableModel для двух комбобоксов в окне диалога в маппере установил QSqlRelationalDelegate. Все работает если при изменении данных меняю значения комбобоксов (либо не меняю, а заново выбираю установленное значение). Но когда открываю диалог и сразу закрываю его, значение одного (акцентирую внимание - одного) комбобокса сбрасывается на первое в списке с обновлением данных в базе. При изменении макета в диалоге, комбобоксы начинают вести себя непредсказуемо - поведение либо меняется на противоположное (при закрытии сбрасывается значение другого комбобокса), либо при закрытии оба значения комбобоксов сбрасывается на первое в списке. Сначала связывал это с тем, что используется один экземпляр делегата для разных комбобоксов, но ведь так он и работает. Использую SQlite. Свойства комбобоксов одинаковые (кроме списков значений), при удалении из кода фрагментов, касающихся одного из комбобоксов ситуация не меняется (первый (comboBox_vid) работает как надо, второй (comboBox_izd) сбрасывается, Фрагмент кода для диалога:
Код:
#include "documentdialog.h"
#include "mainwindow.h"
#include "ui_documentdialog.h"

DocumentDialog::DocumentDialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::DocumentDialog)
{
    ui->setupUi(this);
    QSqlQuery qDok("SELECT * FROM tbl_vidy_dok");
    while (qDok.next()) {
        ui->comboBox_vid->addItem(qDok.value("VID_DOK").toString());
    }
    QSqlQuery qIzd("SELECT * FROM tbl_izdat");
    while (qIzd.next()) {
        ui->comboBox_izd->addItem(qIzd.value("IZDAT").toString());
    }
    mp = new QDataWidgetMapper(this);
    model = new QSqlRelationalTableModel(this);
    model->setTable("tbl_documents");
    model->setEditStrategy(QSqlTableModel::OnManualSubmit);
    model->setJoinMode(QSqlRelationalTableModel::LeftJoin);
    model->setRelation(1,QSqlRelation("tbl_vidy_dok","ID_VID_DOK","VID_DOK"));
    model->setRelation(2,QSqlRelation("tbl_izdat","ID_IZDAT","IZDAT"));
    mp->setSubmitPolicy(QDataWidgetMapper::ManualSubmit);
    mp->setModel(model);
    mp->setItemDelegate(new QSqlRelationalDelegate(mp));
    mp->addMapping(ui->comboBox_vid, 1);
    mp->addMapping(ui->lineEdit_vhod,3);
    mp->addMapping(ui->lineEdit_ish,5);
    mp->addMapping(ui->comboBox_izd, 2);
    mp->addMapping(ui->dateEdit_vhod,4);
    mp->addMapping(ui->dateEdit_ish,6);
    mp->addMapping(ui->plainTextEdit_rez,7);
    connect(this,&DocumentDialog::rejected,this,&DocumentDialog::ready);
}

void DocumentDialog::setIdDok(int iddok)
{
    idDok = iddok;   
    model->setFilter("ID_DOK = "+ QString::number(iddok));
    model->select();   

    mp->toFirst();
}

void DocumentDialog::setIdMer(int idmer)
{
    idMer = idmer;

}

int DocumentDialog::getIdDok()
{
    return idDok;   
}

int DocumentDialog::getIdMer()
{
    return idMer;
}

DocumentDialog::~DocumentDialog()
{
    delete ui;
}

void DocumentDialog::accept()
{

}

void DocumentDialog::ready()
{
    QString tst = ui->comboBox_izd->currentText();
    QString tst2 = ui->comboBox_vid->currentText();
    mp->submit();
    tst = ui->comboBox_izd->currentText();
    tst2 = ui->comboBox_vid->currentText();
    model->submitAll();
    model->select();
}
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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