示例#1
0
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()));
}
示例#2
0
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.
}