AddUserWindow::AddUserWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::AddUserWindow) { ui->setupUi(this); connect(ui->cancelBtn, SIGNAL(pressed()), this, SLOT(on_cancelBtn_clicked())); connect(ui->okBtn, SIGNAL(pressed()), this, SLOT(on_okBtn_clicked())); }
int LoginWindow::qt_metacall(QMetaObject::Call _c, int _id, void **_a) { _id = QMainWindow::qt_metacall(_c, _id, _a); if (_id < 0) return _id; if (_c == QMetaObject::InvokeMetaMethod) { switch (_id) { case 0: on_cancelBtn_clicked(); break; case 1: on_loginBtn_clicked(); break; default: ; } _id -= 2; } return _id; }
// ==== CONFIRMA alterações feitas void MovimentoEditDialog::on_okBtn_clicked() { /* FAZER AQUI as análises necessarias, analisando o conteúdo dos widgets e verificando se eles são válidos de acordo com as regras estabelecidas para o caso. Se algum estiver inválido, retornar e não prosseguir. *** O mesmo que fizemos no exercício "Dialogo" *** */ int cliComboRow= ui->clienteCombo->currentIndex(); if ( cliComboRow<0) { QMessageBox::warning(this, "Erro", "Selecione um cliente"); ui->clienteCombo->setFocus(); return; } // outras validações... QSqlDatabase db = m_movModel->database(); db.transaction(); // linha atual do mapper: int mapperRow = m_movMapper->currentIndex(); if ( !m_insert) { // == recupera o 'id' do movimento no model de movimento (já que permite navegação): m_currentMovimentoId = m_movModel->index( mapperRow, m_colInd.movId).data().toInt(); } // = recupera o 'id' do cliente, já que permite mudar o cliente(tanto em edição quanto em inserção) m_currentClienteId = ui->clienteCombo->model()->index(cliComboRow, 0).data().toInt(); // onde 0(zero) é o índice da coluna "chave" no "relationModel" da "combo"), no caso o "id" do cliente. // o mapper deve fazer com que o model submeta os dados, atualizando a fonte de dados // (pois está posicionado para "ManualSubmit"): QString errMsg; if ( m_canSubmit || m_insert ) // "submit" não falha nas inserções. { if ( !m_movMapper->submit()) errMsg = "Falha ao enviar dados ao banco:\n" + m_movModel->lastError().text(); } else // executa a query UPDATE diretamente no banco { QSqlQuery query(db); int tipo_id = ui->tipoCombo->model()->index(ui->tipoCombo->currentIndex(), 0).data().toInt(); QString mov_date = ui->movDate->date().toString("dd/MM/yyyy"); QString descr = ui->descrEdit->text(); if ( query.exec(QString("UPDATE movimento SET cliente_id = %1, tipo_id = %2, mov_date = '%3', description = '%4' WHERE mov_id = %5") .arg(m_currentClienteId).arg(tipo_id).arg(mov_date).arg(descr).arg(m_currentMovimentoId))) { m_movModel->query().finish(); m_movModel->select(); // select, pois a alteração foi feita sem conhecimento do model(diretamente no banco) } else errMsg = "Falha ao enviar dados diretamente ao banco:\n" + query.lastError().text(); } if ( !errMsg.isEmpty() ) { QMessageBox::warning(this, "ERRO", errMsg); db.rollback(); // desfaz a transação on_cancelBtn_clicked(); // cancela return; } if ( m_insert ) // se inserido, o "id" do movimento só poderá ser recuperado agora (após o "submit") { // pegar o "lastInsertId", caso o driver suporte essa 'feature': QString queryIdText; if (db.driverName()=="QPSQL" ) // POSTGRE suporta a 'feature' "lastInsertID", mas depende de configuração não-default... queryIdText = "select currval('movimento_mov_id_seq')"; // então é mais seguro usar uma query de acesso nativo else if (db.driverName()=="QOCI") // ORACLE, idem... queryIdText = "select movimento_mov_id_seq.currval from dual"; // else if {} ... // outras exceções... if ( queryIdText.isEmpty()) // tenta recuperar id pelo "lastInsertId": { if ( db.driver()->hasFeature(QSqlDriver::LastInsertId)) m_currentMovimentoId = m_movModel->query().lastInsertId().toInt(); else qDebug() << "Driver " << db.driverName() << " nao suporta 'lastInsertId' - pesquisar na documentação do banco"; } else // usa query específica do banco { QSqlQuery queryId(db); if ( queryId.exec(queryIdText) && queryId.next()) // executa e tenta posicionar na primeira(e única) linha da query m_currentMovimentoId = queryId.value(0).toInt(); // pega o valor da primeira(e única) coluna da query else QMessageBox::warning(this, "ERRO", "Falha ao recuperar id do registro inserido:\n" + queryId.lastError().text()); } } // finaliza transação: db.commit(); accept(); // "accept", ao invés de "close": -> além de fechar o diálogo (chamando "close()"), // "accept" faz com que o retorno da função "exec", // no codigo de quem criou o diálogo, retorne "QDialog::Accepted" e assim fique sabendo // que a edição foi CONFIRMADA e não cancelada. }