Qt - kontrolka QListWidget

Stronę tą wyświetlono już: 24 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:

Listing 1
  1. #ifndef MAINWINDOW_H
  2. #define MAINWINDOW_H
  3. #include <QMainWindow>
  4. #include <QMessageBox>
  5. #include <QListWidgetItem>
  6. namespace Ui {
  7. class MainWindow;
  8. }
  9. class MainWindow : public QMainWindow
  10. {
  11. Q_OBJECT
  12. public:
  13. explicit MainWindow(QWidget *parent = 0);
  14. ~MainWindow();
  15. private slots:
  16. void on_addCountry_clicked(); // slot pod sygnał kliknięcia przycisku dodania kraju do QListWiew
  17. void on_channgeSelectedCountry_clicked(); // slot pod sygnał kliknięcia przycisku zmiany nazwy zaznaczonego kraju
  18. void on_removeSelectedCountry_clicked(); // slot pod sygnał kliknięcia przycisku usunięcia zaznaczonego kraju z QLitstView
  19. void on_sortList_clicked(); // slot pod sygnał kliknięcia przycisku sortowania listy krajów
  20. void on_countriesList_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous); // slot pod sygnał zmiany zaznaczonego elementu w kontrolce QListWidget
  21. private:
  22. Ui::MainWindow *ui;
  23. };
  24. #endif // MAINWINDOW_H

W pliku mainwindow.h:

Listing 2
  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. MainWindow::MainWindow(QWidget *parent) :
  4. QMainWindow(parent),
  5. ui(new Ui::MainWindow)
  6. {
  7. ui->setupUi(this);
  8. ui->countriesList->addItems( {"Polska", "Czechy", "Słowacja"}); // dodawanie całej serii elementów do kontrolki QListWidget
  9. ui->countriesList->setSelectionMode(QAbstractItemView::SingleSelection); // ustawienie trybu zaznaczania na możliwość zaznaczania pojedynczej pozycji
  10. }
  11. MainWindow::~MainWindow()
  12. {
  13. delete ui;
  14. }
  15. void MainWindow::on_addCountry_clicked()
  16. {
  17. if(ui->country->text().length()){
  18. if(!ui->countriesList->findItems(ui->country->text(), Qt::MatchExactly).length()){ // sprawdzenie, czy pozycja już istnieje na liście
  19. ui->countriesList->addItem(ui->country->text()); // dodawanie elementu
  20. }else{
  21. QMessageBox::warning(this, "Błąd!", "Ten kraj już jest na liście");
  22. }
  23. }else{
  24. QMessageBox::warning(this, "Błąd!", "Nie podano nazwy kraju");
  25. }
  26. }
  27. void MainWindow::on_channgeSelectedCountry_clicked()
  28. {
  29. if(ui->country->text().length()){ // jeżeli kontrolka QLineText zawiera jakiś tekst to
  30. if(!ui->countriesList->findItems(ui->country->text(), Qt::MatchExactly).length()){ // sprawdzenie, czy pozycja już istnieje na liście
  31. QList<QListWidgetItem*> items = ui->countriesList->selectedItems(); // pobieranie listy zaznaczonych elementów
  32. if(items.length() == 1){ // jeżeli zaznaczony został element to
  33. items[0]->setText(ui->country->text()); // zmieniaj tekst w nim zawarty
  34. }else{
  35. QMessageBox::warning(this, "Błąd!", "Nie zaznaczono kraju do zmiany nazwy");
  36. }
  37. }else{
  38. QMessageBox::warning(this, "Błąd!", "Nie można zmienić nazwy kraju, gdyż taki już istnieje");
  39. }
  40. }else{
  41. QMessageBox::warning(this, "Błąd!", "Nie podano nazwy kraju");
  42. }
  43. }
  44. void MainWindow::on_removeSelectedCountry_clicked()
  45. {
  46. QList<QListWidgetItem*> items = ui->countriesList->selectedItems(); // pobieram listę zaznaczonych elementów
  47. if(items.length() == 1){ // jeżeli zaznaczono jeden element to
  48. delete ui->countriesList->takeItem(ui->countriesList->row(items[0])); // usuwam go z listy
  49. }else{
  50. QMessageBox::warning(this, "Błąd!", "Nie zaznaczono kraju do usunięcia");
  51. }
  52. }
  53. void MainWindow::on_sortList_clicked()
  54. {
  55. ui->countriesList->sortItems(); // sortowanie listy
  56. }
  57. void MainWindow::on_countriesList_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
  58. {
  59. ui->country->setText(current->text()); // ustawienie tekstu wyświetlanego w kontrolce QLineEdit na ten z zaznaczonego elementu kontrolki QListWidget
  60. }
Strony powiązane
strony powiązane
  1. doc.qt.io/qt-4.8/qlistwidget.html - opis klasy QListWidget na stronie dokumentacji Qt

Komentarze