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