Aprenda C++ com QT Creator

  • Página Inicial
  • Contato!
  • Tudo sobre C++ com QT Creator Parte 1!
  • Tudo sobre C++ com QT Creator Parte 2!
  • Tudo sobre C++ com QT Creator Parte 3!
  • Tudo sobre C++ com QT Creator Parte 4!
  • Tudo sobre C++ com QT Creator Parte 5!
  • Tudo sobre C++ com QT Creator Parte 6!
  • Tudo sobre C++ com QT Creator Parte 7!
  • Tudo sobre C++ com QT Creator Parte 5

    Criando e Removendo Diretórios

    Continuando o programa da aula anterior, comente no método de listar, a parte que lista arquivos, e deixe apenas a que lista pastas, dessa forma:

    
    void MainWindow::on_cbUnid_currentTextChanged(const QString &arg1) {
        ui->lstDir->clear();
        
        ui->lstDir->addItem(arg1);
        
        QDir conteudo(arg1);
    
        foreach(QFileInfo qfi, conteudo.entryInfoList()) {
            if(qfi.isDir()) {
                ui->lstDir->addItem("Pasta: " + qfi.absoluteFilePath());
            }
        }
    }
    
    

    Também adicionamaos um método que adiciona por padrão a unidade como primeiro item.

    Adicione o slot clicked no botão adicionar, e coloque esse código:

    
    void MainWindow::on_btnAdd_clicked() {
        local = ui->lstDir->currentItem()->text();
    
        QString nome = ui->txtDir->text().trimmed();
    
        QDir novodir(local + "/" + nome);
    
        if(novodir.exists()) {
            QMessageBox::warning(this, "Pasta", "Diretório " + nome + " já Existe!"); // Inclua QMessageBox
        }
        else {
            novodir.mkdir(local + "/" + nome);
    
            ui->lstDir->clear();
    
            ui->lstDir->addItem(ui->cbUnid->currentText());
    
            QDir conteudo(ui->cbUnid->currentText());
    
            foreach(QFileInfo qfi, conteudo.entryInfoList()) {
                if(qfi.isDir()) {
                    ui->lstDir->addItem("Pasta: " + qfi.absoluteFilePath());
                }
            }
        }
        ui->txtDir->clear();
    }
    
    

    E para remover:

    
    void MainWindow::on_btnRem_clicked() {
        local = ui->lstDir->currentItem()->text();
    
        QString nome = ui->txtDir->text().trimmed();
    
        QDir excldir(local + "/" + nome);
    
        if(!excldir.exists()) {
            QMessageBox::warning(this, "Pasta", "Diretório não Encontrado!"); // Inclua QMessageBox
        }
        else {
            excldir.rmdir(local + "/" + nome);
    
            ui->lstDir->clear();
    
            ui->lstDir->addItem(ui->cbUnid->currentText());
    
            QDir conteudo(ui->cbUnid->currentText());
    
            foreach(QFileInfo qfi, conteudo.entryInfoList()) {
                if(qfi.isDir()) {
                    ui->lstDir->addItem("Pasta: " + qfi.absoluteFilePath());
                }
            }
        }
    }
    
    

    PS: Clique na unidade ou pasta desejada dentro do List Widget antes de criar a pasta.

    Usando Linhas de Comando do Sistema

    Podemos utilizar comandos da linha de comando do sistema no QT, dessa forma (crie um formulário e coloque isso no slot clicked do botão):

    
    QProcess cons; // Inclua QProcess
    
    cons.start("cmd.exe");
    cons.write("echo Exemplo de Uso de linhas de comando no QT>>%userprofile%\\Desktop\\teste2.txt\n\r"); // Não esqueça do \n\r no final do write
    cons.write("exit\n\r");
    
    cons.waitForFinished();
    cons.close();
    
    

    Claro que isso acima foi mais pra mostrarmos o uso do método, porque para criar e ler arquivos usamos outro recurso no QT.

    PS: Comandos de diretórios não funcionam aí. Para navegar por diretórios, no entanto, use os métodos de QDir setCurrent, homePath, etc., explicado anteriormente.

    Em sistemas Unix basta usar o comando assim:

    
    QProcess cons; // Inclua QProcess
    
    cons.start("bash");
    cons.write("echo \"Exemplo de Uso de linhas de comando no QT\">>~/teste2.txt\n\r"); // Não esqueça do \n\r no final do write
    cons.write("exit\n\r");
    
    cons.waitForFinished();
    cons.close();
    
    

    Veja que onde está bash pode ser passado outro shell do sistema, e no último parâmetro passamos o comando desejado.

    PS: Podemos usar startDetached() para rodar as linhas de comando no console do QT.

    Ícone no Programa

    Crie um novo projeto, e na pasta do projeto, crie uma pasta com o nome imagens e coloque a imagem do ícone nele (pode ser em vários formatos, mas é preferível usar ICO).

    No projeto, vá em add new, Qt e Qt Resource File, e coloque o nome ArquivoDeRecursos.

    No arquivosderecursos.qtc, vá em add prefix, e coloque um caminho de pasta, como /img, e aí em add files, adicione a imagem.

    No frame, vá em Window Icon, clique em Choose Resource, procure e adicione o ícone ao nosso programa.

    Para colocar o ícone global (aparecer tanto no executável quanto na barra de tarefas e etc., coloque a imagem no formato ICO no mesmo diretório dos códigos fontes ou dentro de uma pasta. E crie um arquivo com extensão rc (como arquivo.rc) e coloque esse código:

    
    IDI_ICON1 ICON DISCARDABLE "imagens/nomedoicone.ico"
    
    

    E no arquivo .pro adicione a linha com o nome do arquivo rc, por exemplo:

    
    RC_FILE = arquivo.rc
    
    

    Criando Hashs de Senhas no QT

    Basicamente, esse daqui é um exemplo de como criar um hash de senhas para qt:

    
    QString senha = ui->txtSenha->text().trimmed();
        
    QString encripta = QString(QCryptographicHash::hash(senha.toStdString().c_str(), QCryptographicHash::Md5).toHex()); // Inclua QCryptographicHash
    
    QMessageBox::information(this, "Hash", "Hash: " + encripta); // Inclua QMessageBox
    
    

    Além da Hash MD5, podemos usar SHA-1 e SHA-256, entre outras, apenas mudando a constante da classe QCryptographicHash, dessa forma:

    Constantes de Hash
    QCryptographicHash::Md5
    QCryptographicHash::Sha1
    QCryptographicHash::Sha256

    Criando e Lendo Arquivos - Parte 1

    Abra um novo projeto, e coloque um plain text edit e dois push buttons, organize os botões num layout horizontal e tudo num vertical, e aumente o tamanho de tudo para ocupar todo o frame.

    Altere os textos dos botões para gravar e ler no arquivo, e altere também os names dele.

    Crie na pasta do projeto uma pasta e um arquivo de texto, e duas variáveis globais com o caminho desse arquivo, assim:

    
    QString MainWindow::local = "C:/Meus Projetos/C++ Qt/TrabalhandoComArquivos/files/"; // Não esqueça da barra no final
    QString MainWindow::nome = "arquivo.txt"; // Declare as duas variáveis estáticas na classe no arquivo mainwindow.h
    
    

    No slot clicked do botão gravar, adicione esse código:

    
    void MainWindow::on_btnGrav_clicked() {
        QFile arquivo(local + nome); // Inclua QFile
        
        if(!arquivo.open(QFile::WriteOnly | QFile::Text)) {
            QMessageBox::warning(this, "ERRO", "Erro ao Abrir o Arquivo!"); // Inclua QMessageBox
        }
        
        QTextStream saida(&arquivo); // Inclua QTextStream
        QString texto = ui->plArq->toPlainText();
        
        saida << texto;
        
        arquivo.flush();
        arquivo.close();
    
        ui->plArq->clear();
    }
    
    

    No slot clicked do botão ler, coloque esse código:

    
    void MainWindow::on_btnLer_clicked() {
        QFile arquivo(local + nome); // Inclua QFile
    
        if(!arquivo.open(QFile::ReadOnly | QFile::Text)) {
            QMessageBox::warning(this, "ERRO", "Erro ao Abrir o Arquivo!"); // Inclua QMessageBox
        }
    
        QTextStream entrada(&arquivo); // Inclua QTextStream
        QString texto = entrada.readAll();
    
        ui->plArq->setPlainText(texto);
    
        arquivo.close();
    }
    
    

    Criando e Lendo Arquivos - Parte 2

    No projeto anterior, coloque um botão com o texto abrir arquivo e altere o name dele, e adicione o slot clicked nele, e coloque esse código:

    
    void MainWindow::on_btnAbr_clicked() {
        QString filtro = "Todos os Arquivos (*.*) ;; Arquivos de Texto (*.txt)"; // O que importa é o que está dentro dos parênteses
        QString abrir = QFileDialog::getOpenFileName(this, "Abrir Arquivos", QDir::homePath(), filtro); // Inclua QFileDialog e QDir, ao invés do homePath pode ser o caminho, como C://
    
        QFile arquivo(abrir); // Inclua QFile
    
        if(!arquivo.open(QFile::ReadOnly | QFile::Text)) {
            QMessageBox::warning(this, "ERRO", "Erro ao Abrir o Arquivo!"); // Inclua QMessageBox
        }
    
        QTextStream entrada(&arquivo); // Inclua QTextStream
        QString texto = entrada.readAll();
    
        ui->plArq->setPlainText(texto);
    
        arquivo.close();
    }
    
    

    PS: Para remover um arquivo, podemos fazer assim:

    
    QFile arquivo(local);
    
    arquivo.remove();