Stronę tą wyświetlono już: 2652 razy
Kontrolka QListWidget umożliwia wyświetlanie listy elementów w jednej kolumnie z możliwością klikania, zaznaczania, dodawania i edytowanie dodanych do niej elementów. W celu pokazania podstawowych najczęściej stosowanych operacji stworzyłem projekt z graficznym interfejsem użytkownika pokazanym na poniższym rysunku.

Rys. 1
Qt Creator - przykładowe GUI wykorzystujące kontrolkę QListWidget
Użyte powyżej kontrolki to:
- QListWidget, która jest dostępna pod nazwą countriesList;
- QLineEdit, która dostępna jest pod nazwą country;
- QPushButton, które dostępne są kolejno pod nazwami: addCountry; channgeSelectedCountry; removeSelectedCountry i pushButton.
Kod programu w pliku mainwindow.h:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QMessageBox>
#include <QListWidgetItem>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void on_addCountry_clicked(); // slot pod sygnał kliknięcia przycisku dodania kraju do QListWiew
void on_channgeSelectedCountry_clicked(); // slot pod sygnał kliknięcia przycisku zmiany nazwy zaznaczonego kraju
void on_removeSelectedCountry_clicked(); // slot pod sygnał kliknięcia przycisku usunięcia zaznaczonego kraju z QLitstView
void on_sortList_clicked(); // slot pod sygnał kliknięcia przycisku sortowania listy krajów
void on_countriesList_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous); // slot pod sygnał zmiany zaznaczonego elementu w kontrolce QListWidget
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
W pliku mainwindow.h:
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->countriesList->addItems( {"Polska", "Czechy", "Słowacja"}); // dodawanie całej serii elementów do kontrolki QListWidget
ui->countriesList->setSelectionMode(QAbstractItemView::SingleSelection); // ustawienie trybu zaznaczania na możliwość zaznaczania pojedynczej pozycji
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_addCountry_clicked()
{
if(ui->country->text().length()){
if(!ui->countriesList->findItems(ui->country->text(), Qt::MatchExactly).length()){ // sprawdzenie, czy pozycja już istnieje na liście
ui->countriesList->addItem(ui->country->text()); // dodawanie elementu
}else{
QMessageBox::warning(this, "Błąd!", "Ten kraj już jest na liście");
}
}else{
QMessageBox::warning(this, "Błąd!", "Nie podano nazwy kraju");
}
}
void MainWindow::on_channgeSelectedCountry_clicked()
{
if(ui->country->text().length()){ // jeżeli kontrolka QLineText zawiera jakiś tekst to
if(!ui->countriesList->findItems(ui->country->text(), Qt::MatchExactly).length()){ // sprawdzenie, czy pozycja już istnieje na liście
QList<QListWidgetItem*> items = ui->countriesList->selectedItems(); // pobieranie listy zaznaczonych elementów
if(items.length() == 1){ // jeżeli zaznaczony został element to
items[0]->setText(ui->country->text()); // zmieniaj tekst w nim zawarty
}else{
QMessageBox::warning(this, "Błąd!", "Nie zaznaczono kraju do zmiany nazwy");
}
}else{
QMessageBox::warning(this, "Błąd!", "Nie można zmienić nazwy kraju, gdyż taki już istnieje");
}
}else{
QMessageBox::warning(this, "Błąd!", "Nie podano nazwy kraju");
}
}
void MainWindow::on_removeSelectedCountry_clicked()
{
QList<QListWidgetItem*> items = ui->countriesList->selectedItems(); // pobieram listę zaznaczonych elementów
if(items.length() == 1){ // jeżeli zaznaczono jeden element to
delete ui->countriesList->takeItem(ui->countriesList->row(items[0])); // usuwam go z listy
}else{
QMessageBox::warning(this, "Błąd!", "Nie zaznaczono kraju do usunięcia");
}
}
void MainWindow::on_sortList_clicked()
{
ui->countriesList->sortItems(); // sortowanie listy
}
void MainWindow::on_countriesList_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
{
ui->country->setText(current->text()); // ustawienie tekstu wyświetlanego w kontrolce QLineEdit na ten z zaznaczonego elementu kontrolki QListWidget
}