Compartilhe esta página

Aprenda X em Y Minutos

Onde X=Qt Framework

Qt é amplamente conhecido como um framework para desenvolvimento de software multi-plataforma que pode rodar em vários outras plataformas de softwares e hardwares com pouca ou nenhuma alteração no código, enquanto mantém o poder e a velocidade de uma aplicação nativa. Embora o Qt tenha sido originalmente escrito em C++, é possível utilizá-lo em outras linguagens: PyQt, QtRuby, PHP-Qt, etc.

Qt é ótimo para criar aplicações com interface gráfica (GUI). Esse tutorial será feito em C++.

/*
 * Vamos começar
 */

// Todos as dependências do framework Qt iniciam com a letra 'Q' maiúscula
#include <QApplication>
#include <QLineEdit>

int main(int argc, char *argv[]) {
     // Cria um objeto para utilizar todos os recursos da aplicação
    QApplication app(argc, argv);

    // Cria um widget com linha editável e exibe na tela
    QLineEdit lineEdit("Hello world!");
    lineEdit.show();

    // Inicia a aplicação em um evento de loop
    return app.exec();
}

A parte gráfica do Qt é toda composta de widgets e conexões entre eles.

LEIA MAIS SOBRE WIDGETS

/*
 * Vamos criar um label e um botão.
 * Um label irá aparecer quando o botão for clicado
 *
 * O próprio código do Qt é autoexplicativo.
 */

#include <QApplication>
#include <QDialog>
#include <QVBoxLayout>
#include <QPushButton>
#include <QLabel>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    QDialog dialogWindow;
    dialogWindow.show();

    // Adiciona um layout vertical
    QVBoxLayout layout;
    dialogWindow.setLayout(&layout);

    QLabel textLabel("Thanks for pressing that button");
    layout.addWidget(&textLabel);
    textLabel.hide();

    QPushButton button("Press me");
    layout.addWidget(&button);

    // Exibe o label oculto quando o botão é clicado
    QObject::connect(&button, &QPushButton::pressed,
                     &textLabel, &QLabel::show);

    return app.exec();
}

Veja o QObject::connect. O método é usado para conectar o SINAL de um objeto ao ENCAIXE outro.

Sinais são emitidos quando algo ocorre com o objeto, como quando o sinal de clique é acionado apertando o QPushButton.

Encaixes são ações que são executadas em resposta aos sinais recebidos.

LEIA MAIS SOBRE SINAIS E ENCAIXES

A seguir vamos aprender como usar não somente o comportamento padrão dos widgets, mas também extender seus comportamentos usando herança. Vamos criar um botão e contar quantas vezes é pressionado. Para esse propósito definiremos nossa própria classe CounterLabel. Ela deve ser declarada em um arquivo diferente devido a estrutura específica do Qt.

// counterlabel.hpp

#ifndef COUNTERLABEL
#define COUNTERLABEL

#include <QLabel>

class CounterLabel : public QLabel {
    Q_OBJECT  // Define os macros presente em todo objeto Qt

public:
    CounterLabel() : counter(0) {
        setText("Counter has not been increased yet");  // método do QLabel
    }

public slots:
    // Ação que será chamada em resposta ao clique do botão
    void increaseCounter() {
        setText(QString("Counter value: %1").arg(QString::number(++counter)));
    }

private:
    int counter;
};

#endif // COUNTERLABEL
// main.cpp
// Quase igual ao exemplo anterior

#include <QApplication>
#include <QDialog>
#include <QVBoxLayout>
#include <QPushButton>
#include <QString>
#include "counterlabel.hpp"

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    QDialog dialogWindow;
    dialogWindow.show();

    QVBoxLayout layout;
    dialogWindow.setLayout(&layout);

    CounterLabel counterLabel;
    layout.addWidget(&counterLabel);

    QPushButton button("Push me once more");
    layout.addWidget(&button);
    QObject::connect(&button, &QPushButton::pressed,
                     &counterLabel, &CounterLabel::increaseCounter);

    return app.exec();
}

É isso! Claro, o framework Qt é muito maior do que exemplificamos no tutorial, então esteja preparado para ler e praticar mais.

Leitura complementar

Boa sorte e divirta-se!


Sugestões ou correções? Abra uma issue no repositório do GitHub, ou faça um pull request você mesmo!

Originalmente contribuído por Aleksey Kholovchuk e atualizado por 2 colaborador(es).