Autor podstrony: Krzysztof Zajączkowski

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.

Qt Creator - przykładowe GUI wykorzystujące kontrolkę QListWidget
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 }
Strony powiązane
strony powiązane
  1. doc.qt.io/qt-4.8/qlistwidget.html - opis klasy QListWidget na stronie dokumentacji Qt
Layout wykonany przez autora strony, wszelkie prawa zastrzeżone. Jakiekolwiek użycie części lub całości grafik znajdujących się na tej stronie bez pisemnej zgody jej autora surowo zabronione.