List View

O QListWidget é um widget utilizado para exibir uma lista de itens. Nesse tutorial iremos aprender como adicionar, renomear e remover itens do widget de lista.

Para começarmos o tutorial, temos o aquivo header, cpp e o main:

listwidget.h

#pragma once

#include <QWidget>
#include <QPushButton>
#include <QListWidget>

class ListWidget : public QWidget {
    
  Q_OBJECT

  public:
    ListWidget(QWidget *parent = 0);

  private slots:
    void addItem();
    void renameItem();
    void removeItem();
    void clearItems();

  private:
    QListWidget *lw;
    QPushButton *add;
    QPushButton *rename;
    QPushButton *remove;
    QPushButton *removeAll; 
};

listwidget.cpp

#include "listwidget.h"
#include <QVBoxLayout>
#include <QInputDialog>

ListWidget::ListWidget(QWidget *parent)
    : QWidget(parent) {

  QVBoxLayout *vbox = new QVBoxLayout();
  vbox->setSpacing(10);

  QHBoxLayout *hbox = new QHBoxLayout(this);

  lw = new QListWidget(this);
  lw->addItem("O Auto da Compadecida");
  lw->addItem("Cidade de Deus");
  lw->addItem("Tropa de Elite");
  lw->addItem("Hoje Eu Quero Voltar Sozinho");
  lw->addItem("Minha Mãe é uma Peça");

  add = new QPushButton("Adicionar", this);
  rename = new QPushButton("Renomear", this);
  remove = new QPushButton("Remover", this);
  removeAll = new QPushButton("Remover Todos", this);

  vbox->setSpacing(3);
  vbox->addStretch(1);
  vbox->addWidget(add);
  vbox->addWidget(rename);
  vbox->addWidget(remove);
  vbox->addWidget(removeAll);
  vbox->addStretch(1);

  hbox->addWidget(lw);
  hbox->addSpacing(15);
  hbox->addLayout(vbox);

  connect(add, &QPushButton::clicked, this, &ListWidget::addItem);
  connect(rename, &QPushButton::clicked, this, &ListWidget::renameItem);
  connect(remove, &QPushButton::clicked, this, &ListWidget::removeItem);
  connect(removeAll, &QPushButton::clicked, this, &ListWidget::clearItems);

  setLayout(hbox);
}

void ListWidget::addItem() {

  QString c_text = QInputDialog::getText(this, "Item", "Adicione um novo item");
  QString s_text = c_text.simplified();

  if (!s_text.isEmpty()) {

    lw->addItem(s_text);
    int r = lw->count() - 1;
    lw->setCurrentRow(r);
  }
}

void ListWidget::renameItem() {

  QListWidgetItem *curitem = lw->currentItem();

  int r = lw->row(curitem);
  QString c_text = curitem->text();
  QString r_text = QInputDialog::getText(this, "Item",
      "Insira o novo nome", QLineEdit::Normal, c_text);

  QString s_text = r_text.simplified();

  if (!s_text.isEmpty()) {

    QListWidgetItem *item = lw->takeItem(r);
    delete item;
    lw->insertItem(r, s_text);
    lw->setCurrentRow(r);
  }
}

void ListWidget::removeItem() {

  int r = lw->currentRow();

  if (r != -1) {

    QListWidgetItem *item = lw->takeItem(r);
    delete item;
  }
}

void ListWidget::clearItems(){

  if (lw->count() != 0) {
    lw->clear();
  }
}

main.cpp

#include <QApplication>
#include "listwidget.h"

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

  QApplication app(argc, argv);

  ListWidget window;

  window.setWindowTitle("QListWidget");
  window.show();

  return app.exec();
}

Criando a lista e preenchendo

Exibimos um widget de lista e quatro botões. Usamos os botões para adicionar, renomear e remover itens da lista. O QListWidget é criado e preenchido com cinco itens:

lw = new QListWidget(this);
  lw->addItem("O Auto da Compadecida");
  lw->addItem("Cidade de Deus");
  lw->addItem("Tropa de Elite");
  lw->addItem("Hoje Eu Quero Voltar Sozinho");
  lw->addItem("Minha Mãe é uma Peça");

Adicionando novos itens

O método addItem adiciona um novo item a lista. O método abre uma caixa de diálogo de entrada, que retorna uma string. Removemos possíveis espaços em branco da string usando o método “simplified”. Se a string retornada não estiver vazia, nós a adicionamos no final da lista. Por fim, destacamos o item inserido com o método “setCurrentRow”:

void ListWidget::addItem() {
    
  QString c_text = QInputDialog::getText(this, "Item", "Adicione um novo item"");
  QString s_text = c_text.simplified();
  
  if (!s_text.isEmpty()) {
      
    lw->addItem(s_text);
    int r = lw->count() - 1;
    lw->setCurrentRow(r);
  }
}

Renomeando os itens

Renomear um item consiste em várias etapas. Primeiro, obtemos o item atual (o selecionado) usando o método “currentItem”, então pegamos o texto dele e a linha onde está localizado. O texto do item é exibido na caixa de diálogo QInputDialog. A string que é retornada pela caixa de diálogo é processada pelo método “simplified” para remover possiveis espaços em branco. Em seguida, removemos o item antigo com o método “takeItem” e o substituimos pelo método “insertItem”. Excluímos item removido pelo método takeItem, pois os itens removidos não são mais gerenciados pelo Qt. Finalmente, o setCurrentRow seleciona o novo item:

void ListWidget::renameItem() { 
    
  QListWidgetItem *curitem = lw->currentItem(); 
  
  int r = lw->row(curitem); 
  QString c_text = curitem->text(); 
  QString r_text = QInputDialog::getText(this, "Item", 
      "Digite novo item", QLineEdit::Normal, c_text); 
  
  QString s_text = r_text.simplified(); 
  
  if (!s_text.isEmpty()) { 
      
    QListWidgetItem *item = lw->takeItem(r); 
    apagar item; 
    lw->insertItem(r, s_texto); 
    lw->setCurrentRow(r); 
  } 
}

Removendo itens

A função removeItem remove um item específico da lista. Primeiro, ele pega o item selecionado com o método “currentRow” (ele retorna -1 se não houver mais listas restantes). O item selecionado é removido usando o método “takeItem”:

void ListWidget::removeItem() { 
    
  int r = lw->currentRow(); 

  if (r != -1) { 
      
    QListWidgetItem *item = lw->takeItem(r); 
    apagar item; 
  } 
}

Já a função clearItems, remove todos os itens da lista:

void ListWidget::clearItems(){
    
  if (lw->count() != 0) {
    lw->clear();
  }
}