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();
}
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();
}
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.
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;
}
}
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);
}
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.
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.