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 6

    Criando um Bloco de Notas - Parte 1

    Abra um novo projeto, coloque o nome nele em WindowTitle e crie um arquivo de recursos (Add New File > Qt > New Resource File) e dê o nome ArquivoDeRecursos.

    Dentro da pasta do programa, coloque a pasta com ícones (clique aqui pra baixar), adicione no arquivo de recursos o prefixo /icones e coloque os ícones dele lá dentro.

    Clique com o botão direito em Add Menu Bar e Add Tool Bar, caso elas já não existam. Adicione o Menu Arquivo, com os itens Novo, Abrir, um separador, Salvar e Salvar Como, outro separador e o item Fechar.

    Crie outro menu com o texto Editar, e os itens Desfazer, Refazer, um separador, Recortar, Copiar e Colar. Faça também um Menu com Sobre e Item Sobre o Programa.

    Coloque os ícones, em Icon e no lado dele, escolha o ícone no arquivo de recursos. Faça com todos os itens. Depois disso, arraste da barra de tarefas os ícones para a Toolbar, na mesma ordem (deixe apenas o fechar por último, separado por um separador).

    Adicione um Text Edit e cubra ele todo por todo o frame, ou quase todo.

    No código do mainwindow.cpp, coloque isso:

    
    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    // Coloque as importações para QMessageBox, QFile, QFileDialog e QTextStream
    
    MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) {
        ui->setupUi(this);
    
        this->setCentralWidget(ui->textEdit); // Isso fará o Text Edit ocupar todo o frame.
    }
    
    MainWindow::~MainWindow() {
        delete ui;
    }
    
    

    No mainwindow.h, coloque isso dentro da classe, em private:

    
    QString localArquivo;
    
    

    Adicione o slot trigerred no item novo e coloque esse código:

    
    void MainWindow::on_actionNovo_triggered() {
        localArquivo = "";
        ui->textEdit->clear();
        ui->textEdit->setFocus();
    }
    
    

    Criando um Bloco de Notas - Parte 2

    Continuando, iremos adicionar no item Abrir o slot triggered nele, e colocaremos esse código:

    
    void MainWindow::on_actionAbrir_triggered() {
        QString filtro = "Todos os Arquivos (*.*) ;; Arquivos de Texto (*.txt)";
        QString nomeArquivo = QFileDialog::getOpenFileName(this, "Abrir", QDir::homePath(), filtro); // Importe QFileDialog
        QFile arquivo(nomeArquivo); // Importe QFile
    
        localArquivo = nomeArquivo; // Variável Global criada anteriormente
    
        if(!arquivo.open(QFile::ReadOnly | QFile::Text)) {
            QMessageBox::warning(this, "Aviso", "O Arquivo não Pôde ser Aberto!"); // Importe QMessageBox
            return;
        }
    
        QTextStream entrada(&arquivo); // Importe QTextStream
        QString texto = entrada.readAll();
    
        ui->textEdit->setText(texto);
    
        arquivo.close();
    }
    
    

    Criando um Bloco de Notas - Parte 3

    Agora crie o slot triggered do Salvar Como, e coloque esse código:

    
    void MainWindow::on_actionSalvar_Como_triggered() {
        QString filtro = "Todos os Arquivos (*.*) ;; Arquivos de Texto (*.txt)";
        QString nomeArquivo = QFileDialog::getSaveFileName(this, "Salvar", QDir::homePath(), filtro); // Importe QFileDialog
        QFile arquivo(nomeArquivo); // Importe QFile
        localArquivo = nomeArquivo; // Variável Global
    
        if(!arquivo.open(QFile::WriteOnly | QFile::Text)) {
            QMessageBox::warning(this, "Aviso", "O Arquivo não Pôde ser Salvo!"); // Importe QMessageBox
            return;
        }
    
        QTextStream saida(&arquivo); // Importe QTextStream
        QString texto = ui->textEdit->toPlainText();
    
        saida << texto;
    
        arquivo.flush();
    
        arquivo.close();
    }
    
    

    Adicione também o slot triggered do Salvar, e coloque esse código:

    
    void MainWindow::on_actionSalvar_triggered() {
        QFile arquivo(localArquivo); // Importe QFile, variável Global
    
        if(!arquivo.open(QFile::WriteOnly | QFile::Text)) {
            QMessageBox::warning(this, "Aviso", "O Arquivo não Pôde ser Salvo!"); // Importe QMessageBox
            return;
        }
    
        QTextStream saida(&arquivo); // Importe QTextStream
        QString texto = ui->textEdit->toPlainText();
    
        saida << texto;
    
        arquivo.flush();
    
        arquivo.close();
    }
    
    

    Adicione o slot triggered do Fechar, Recortar, Copiar e Colar, e coloque isso:

    
    void MainWindow::on_actionFechar_triggered() {
        close();
    }
    
    void MainWindow::on_actionCopiar_triggered() {
        ui->textEdit->copy();
    }
    
    void MainWindow::on_actionRecortar_triggered() {
        ui->textEdit->cut();
    }
    
    void MainWindow::on_actionColar_triggered() {
        ui->textEdit->paste();
    }
    
    

    Esses são dos triggereds de Desfazer e Refazer:

    
    void MainWindow::on_actionDesfazer_triggered() {
        ui->textEdit->undo();
    }
    
    void MainWindow::on_actionRefazer_triggered() {
        ui->textEdit->redo();
    }
    
    

    PS: Podemos adicionar atalhos de teclas para os comandos do menu.

    Criando um Bloco de Notas - Parte 4

    Continuando nosso bloco de notas, adicione um menu com o texto Formatar (antes do sobre) e os itens Fonte, Cor da Fonte e Cor de fundo.

    Adicione o slot triggered no item Fonte e coloque esse código:

    
    void MainWindow::on_actionFonte_triggered() {
        bool fonteOk;
        QFont fonte = QFontDialog::getFont(&fonteOk, this); // inclua QFont e QFontDialog
    
        if(fonteOk) {
            ui->textEdit->setFont(fonte);
        }
        else {
            return;
        }
    }
    
    

    Agora adicione o triggered do item Cor da Fonte e coloque esse código:

    
    void MainWindow::on_actionCor_triggered() {
        QColor cor = QColorDialog::getColor(Qt::black, this, "Escolha uma Cor"); // inclua QColor e QColorDialog
    
        if(cor.isValid()) {
            ui->textEdit->setTextColor(cor);
        }
        else {
            return;
        }
    }
    
    

    E no triggered da cor do fundo coloque isso:

    
    void MainWindow::on_actionCor_de_Fundo_triggered() {
        QColor cor = QColorDialog::getColor(Qt::white, this, "Escolha uma Cor"); // inclua QColor e QColorDialog
    
        if(cor.isValid()) {
            ui->textEdit->setTextBackgroundColor(cor);
        }
        else {
            return;
        }
    }
    
    

    Criando um Bloco de Notas - Parte 5

    Adicione no menu arquivo o item Imprimir, antes do Fechar, com um separador.

    No arquivo .pro, vá na linha 7 (aproximadamente), onde está QT e coloque isso:

    
    QT       += core gui printsupport
    
    

    Adicione o slot triggered no item Imprimir e coloque esse código:

    
    void MainWindow::on_actionImprimir_triggered() {
        QPrinter imp; // inclua QPrinter
    
        imp.setPrinterName("Impressora");
    
        QPrintDialog cxImp(&imp, this); // inclua QPrintDialog
    
        if(cxImp.exec() == QDialog::Rejected) {
            return;
        }
        
        ui->textEdit->print(&imp);
    }
    
    

    Classe QTimer - Gerenciamento de Intervalos

    Crie um novo projeto e vá no mainwindow.h e altere o código assim:

    
    #include <QMainWindow>
    #include <QTimer> // Inclua isso
    #include <QDebug> // Inclua isso
    
    namespace Ui {
        class MainWindow;
    }
    
    class MainWindow : public QMainWindow {
        Q_OBJECT
    
        public:
            explicit MainWindow(QWidget *parent = nullptr);
            ~MainWindow();
        public slots:
            void minhaFuncao();
        private:
            Ui::MainWindow *ui;  
            QTimer *tempo;
            static int cont;
    };
    
    

    No mainwindow.cpp, altere assim:

    
    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    
    int MainWindow::cont = 0;
    
    MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) {
        ui->setupUi(this);
    
        tempo = new QTimer(this); // Variável global criada.
        connect(tempo, SIGNAL(timeout()), this, SLOT(minhaFuncao()));
    
        tempo->start(1000); // Tempo em milissegundos que define o tempo que a função é executada
    }
    
    MainWindow::~MainWindow() {
        delete ui;
    }
    
    void MainWindow::minhaFuncao() {
        cont++;
        qDebug() << "Timer: " << cont; // Inclua QDebug
    }
    
    

    O código aparecerá no debug, executado de um em um segundo.

    Classe QTimer - Criando um Relógio Digital

    Continuando o programa anterior, podemos criar um programa que pegue a hora do sistema e atualize de um em um segundo. Colocamos um label e mudamos o nome dele para lblRelogio.

    No mainwindow.h, altere o código dessa forma:

    
    class MainWindow : public QMainWindow {
        Q_OBJECT
    
        public:
            explicit MainWindow(QWidget *parent = nullptr);
            ~MainWindow();
        public slots:
            void atualizaRelogio();
        private:
            Ui::MainWindow *ui;  
            QTimer *tempo; // Inclua QTimer
    };
    
    

    E o mainwindow.cpp, altere dessa forma:

    
    MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) {
        ui->setupUi(this);
    
        tempo = new QTimer(this); // Variável global criada.
        connect(tempo, SIGNAL(timeout()), this, SLOT(atualizaRelogio()));
    
        tempo->start(1000); // Tempo em milissegundos que define o tempo que a função é executada
    }
    
    MainWindow::~MainWindow() {
        delete ui;
    }
    
    void MainWindow::atualizaRelogio() {
        QTime tempoAtual = QTime::currentTime(); // Retorna o horário atual, é QTime mesmo, inclua QDateTime
        QString tempoTexto = tempoAtual.toString("hh:mm:ss");  // Formatação da hora
    
        ui->lblRelogio->setText(tempoTexto);
    }
    
    

    Pra formatar o label, basta ir nas propriedades dele, em font.