Qt - kontrolka QListWidget
Stronę tą wyświetlono już: 1908 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
- }