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 4

    List Widget

    Abra um novo projeto e coloque um list widget nele. Coloque acima dele um line height e quatro push buttons e organize eles.

    Os nomes dos botões serão adicionar, adicionar * (vários), marcar e desmarcar. E as variáveis, txtItem, btnAdd, btnAdAs, btnMarc, btnDesm e lstItens

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

    
    void MainWindow::on_btnAdd_clicked() {
        if(ui->txtItem->text().trimmed().compare("")) { // Inverso da comparação
            ui->lstItens->addItem(ui->txtItem->text().trimmed());
            
            ui->txtItem->clear();
            ui->txtItem->setFocus();
        }
    }
    
    

    Aí ele poderá adicionar os elementos digitados na lista.

    Para adicionar vários itens de uma só vez, podemos colocar esse código no slot clicked do segundo botão:

    
    void MainWindow::on_btnAdAs_clicked() {
        QListWidgetItem *item1 = new QListWidgetItem("C++");
        QListWidgetItem *item2 = new QListWidgetItem("C#");
        QListWidgetItem *item3 = new QListWidgetItem("PHP");
        QListWidgetItem *item4 = new QListWidgetItem("Java");
        QListWidgetItem *item5 = new QListWidgetItem("Python");
        
        
        ui->lstItens->addItem(item1);
        ui->lstItens->addItem(item2);
        ui->lstItens->addItem(item3);
        ui->lstItens->addItem(item4);
        ui->lstItens->addItem(item5);    
    }
    
    

    No slot clicked do marcar, colocaremos isso:

    
    void MainWindow::on_btnMarc_clicked() {
        ui->lstItens->currentItem()->setForeground(Qt::lightGray);
        ui->lstItens->currentItem()->setBackground(Qt::darkGreen);    
    }
    
    

    Da forma acima, usamos constantes que alteram as cores dos itens da lista. Aí ele mudará a cor dos itens que marcarmos.

    E no slot clicked do desmarcar, usamos a mesma lógica, com as cores padrões:

    
    void MainWindow::on_btnDesm_clicked() {
        ui->lstItens->currentItem()->setForeground(Qt::black);
        ui->lstItens->currentItem()->setBackground(Qt::white);
    }
    
    

    Agora, para indicar que marcamos vários itens na programação, temos que fazer diferente. Declare um vector global assim:

    
    QVector<int> marcados; // Inclua QVector
    
    

    E altere os métodos de eventos assim:

    
    void MainWindow::on_btnMarc_clicked() {
        if(ui->lstItens->currentRow() != -1) {
            if(marcados.indexOf(ui->lstItens->currentRow()) == -1) {
                ui->lstItens->currentItem()->setForeground(Qt::lightGray);
                ui->lstItens->currentItem()->setBackground(Qt::darkGreen);
    
                marcados.push_back(ui->lstItens->currentRow());
    
                qDebug() << "Marcados: " << marcados; // Inclua QDebug
            }
        }
    }
    
    void MainWindow::on_btnDesm_clicked() {
        if(ui->lstItens->currentRow() != -1) {
            if(marcados.indexOf(ui->lstItens->currentRow()) >= 0) {
                ui->lstItens->currentItem()->setForeground(Qt::black);
                ui->lstItens->currentItem()->setBackground(Qt::white);
    
                marcados.erase(marcados.begin() + marcados.indexOf(ui->lstItens->currentRow()));
    
                qDebug() << "Marcados: " << marcados;
            }
        }
    }
    
    

    No caso acima, no console do Qt aparecerá as posições marcadas.

    Embaixo da lista, colocamos um botão com o texto Desmarcar Todos, a variável btnDesmTod e colocamos esse código, para desmarcar tudo:

    
    void MainWindow::on_btnDesmTod_clicked() {
        while(!marcados.empty()) {
            ui->lstItens->setCurrentRow(marcados.last());
            ui->lstItens->currentItem()->setForeground(Qt::black);
            ui->lstItens->currentItem()->setBackground(Qt::white);
            marcados.pop_back();
        }
    }
    
    

    TabWidget

    O tabwidget permite termos abas (guias) no nosso programa. Para usar ele, abra um novo projeto e adicione o componente tabwidget, e coloque a variável tbAbas.

    Em cada aba, coloque dois labels, com conteúdos diferentes. Para alterar o texto da aba, clique nela e vá nas propriedades, e procre por currentTabText. Para tornar elas fecháveis, marque a casa de tabsClosable (mas precisaremos programar para fechar), adicione no tabWidget o slot de tabCloseRequested, e coloque esse código nele:

    
    void MainWindow::on_tbAbas_tabCloseRequested(int index) {
        ui->tbAbas->removeTab(index); // O número passado é o referente da aba, começando do 0.
    }
    
    

    É possível adicionar uma aba clicando no widget e indo em insert page, mas vamos adicionar elas via programação, para isso coloque um botão fora das abas para isso, mude o name e adicione o slot de clicked nele, e coloque o código assim:

    
    void MainWindow::on_btnAdd_clicked() {
        ui->tbAbas->addTab(new QWidget(), "Nova Aba: " + QString::number(ui->tbAbas->count() + 1));
    }
    
    

    Mas para não dar erros de contagem ao fechar abas, podemos criar uma variável global e inicializar ela no construtor, assim:

    
    MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) {
        ui->setupUi(this);
        
        i = ui->tbAbas->count(); // Coloque a variável i estática do tipo int na classe MainWindow em mainwindow.h
    }
    
    

    Adicione o decremento dessa variável no método de remover:

    
    void MainWindow::on_tbAbas_tabCloseRequested(int index) {
        ui->tbAbas->removeTab(index); // O número passado é o referente da aba, começando do 0.
        i--;
    }
    
    

    E no método de botão de adicionar, assim:

    
    void MainWindow::on_btnAdd_clicked() {
        i++;
        ui->tbAbas->addTab(new QWidget(), "Nova Aba: " + QString::number(i));
    }
    
    

    Agora adicione um botão para fecharmos a aba aberta, mude o name adicione o slot de clicked nela e coloque esse código:

    
    void MainWindow::on_btnRem_clicked() {
        ui->tbAbas->removeTab(ui->tbAbas->currentIndex());
        i--;
    }
    
    

    TabWidget - Parte 2

    Voltando ao projeto anterior, exclua as labels de exemplo das tabs. Como vimos, podemos remover e adicionar páginas clicando com o botão direito, podemos remover indo em Page 1 e 2 (ou a página atual) e em delete.

    No entanto, vamos adicionar mais uma tab, para fazermos um formulário. Basicamente, nós arrastamos os componentes para isso. Mas vamos adicionar uma tab que é aberta com um botão, já com o formulário.

    Adicione um botão para adicionarmos o formulário, mude o name e o texto dele.

    Vá no nosso projeto, vá em Add New, Qt e Add Designer Form Class, e escolha a opção Widget do template.

    No novo formulário, adicione três labels, três line edit e duas botões. Organize cada label e line edit num layout horizontal, e os dois botões também, e coloque tudo num vertical.

    Volte no formulário principal e adicione o slot de clicked no botão criado, e coloque esse código:

    
    void MainWindow::on_btnCads_clicked() {
        i++;
        ui->tbAbas->addTab(new FormTab(), "Novo Cadastro"); // Inclua formtab.h
    }
    
    

    Trabalhando com Diretórios - Parte 1

    Num novo projeto, coloque um combobox, abaixo dele um list widget, e abaixo dele, um line text e dois botões, alinhe estes nuum layout horizontal e tudo num vertical.

    Os botões serão para remover e adicionar diretórios, mude os names deles e dos outros conteúdos.

    No exemplo, a pasta será criada na mesma pasta do projeto.

    Primeiramente, coloque esse método no mainwindow.cpp:

    
    QString MainWindow::local = "C:/Meus Projetos/C++ Qt/TrabalhandoComDiretorios/"; // Caminho desejado, global, coloque na classe como static
    
    MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) {
        ui->setupUi(this);
    
        QDir unidades;// Inclua QDir
    
        foreach(QFileInfo qfi, unidades.drives()) {
            ui->cbUnid->addItem(qfi.absoluteFilePath());
        }
    }
    
    

    Isso retornará as unidades no combobox.

    Adicione no combobox, o slot de currentTextChanged, que retorna uma string, e coloque esse código:

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

    PS: Podemos mover por diretório, semelhante ao chdir usado no C++ comum, dentro do QT usamos o método estático setCurrent() de QDir, assim (inclua QDir):

    
    QDir::setCurrent(QDir::homePath() + "/Desktop"); // Vai até a área de trabalho
    
    qDebug() << QDir::currentPath(); // Mostra diretório atual.
    
    

    Como visto acima, o homePath() retorna o home do usuário (C:\Users\Usuário no Windows, /home/usuário no Linux), temos também o rootPath() que retorna a raiz do sistema (C:\ no Windows e / no Linux) e o tempPath() que retorna a pasta de temporários do sistema. O currentPath() mostra o diretório atual da execução.