Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

QDataWidgetMapper и несколько QCombobox



  • Здравствуйте! Столкнулся с проблемой - при использовании 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();
    }
    

Log in to reply