Qt - kontrolka QTreeView

Stronę tą wyświetlono już: 35 razy

Kontrolka QTreeView umożliwia tworzenie drzewiastej listy tak samo jak wcześniej omawiana kontrolka QTreeWidget. Różnica polega na sposobie dodawania i edytowania elementów w kontrolce QTreeView, gdzie aby dodać kolejne elementy konieczne jest utworzenie obiektu klasy QStandardItemModel.

Qt Creator przykład zastosowania kontrolki QTreeView
Rys. 1
Qt Creator przykład zastosowania kontrolki QTreeView

Kod programu w pliku mainwindow.h:

Listing 1
  1. #ifndef MAINWINDOW_H
  2. #define MAINWINDOW_H
  3. #include <QMainWindow>
  4. #include <QStandardItemModel>
  5. #include <QStandardItem>
  6. namespace Ui {
  7. class MainWindow;
  8. }
  9. class MainWindow : public QMainWindow
  10. {
  11. Q_OBJECT
  12. QStandardItemModel *treeViewModel; // obiekt modelu, który będzie sterował elementami kontrolki QTreeView
  13. void resizeEvent(QResizeEvent*) override; // obsługa zdarzenia zmiany rozmiaru okna w celu dostosowania wymiarów kontrolki QTreeView do okna głównego
  14. public:
  15. explicit MainWindow(QWidget *parent = 0);
  16. ~MainWindow();
  17. private:
  18. Ui::MainWindow *ui;
  19. };
  20. #endif // MAINWINDOW_H

Kod programu w pliku mainwindow.cpp:

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. // tworzę nowy obiekt klasy QStandardItemModel
  9. treeViewModel = new QStandardItemModel(ui->treeView);
  10. // ustawiam liczbę kolumn modelu
  11. treeViewModel->setColumnCount(2);
  12. // ustawiam nazwy kolumn
  13. treeViewModel->setHorizontalHeaderLabels(
  14. {"Nazwa", "Opis"}
  15. );
  16. // tworzę główny element listy
  17. QStandardItem *itemEurope = new QStandardItem;
  18. // ustawiam jego nazwę
  19. itemEurope->setText("Europa");
  20. // tworzę podgałąź
  21. QStandardItem *itemZSRE = new QStandardItem;
  22. // ustawiam jej tekst
  23. itemZSRE->setText("ZSRE");
  24. // dodaję ją do korzenia
  25. itemEurope->setChild(0, 0, itemZSRE);
  26. // tworzę ikonkę z pliku wrzuconego do zasobów
  27. QIcon iconEurope(":/images/open.png");
  28. // podpinam ikonkę
  29. itemEurope->setIcon(iconEurope);
  30. // tworzę ikonkę z zasobów dla elementu itemZSRE
  31. QIcon iconZSRE(":/images/ue.png");
  32. // ustawiam ikonkę
  33. itemZSRE->setIcon(iconZSRE);
  34. // tworzę element z opisem
  35. QStandardItem *itemZSREdescription = new QStandardItem;
  36. // ustawiam opis
  37. itemZSREdescription->setText("Związek Socjalistycznych Republik Europejskich");
  38. // dodaję element z opisem
  39. itemEurope->setChild(0, 1, itemZSREdescription);
  40. // dodaję do modelu całą gałąź
  41. treeViewModel->setItem(0, 0, itemEurope);
  42. // lista krajów do dodania
  43. QStringList ZSRE = {
  44. "Austria",
  45. "Belgia",
  46. "Bułgaria",
  47. "Chorwacja",
  48. "Cypr",
  49. "Czechy",
  50. "Dania",
  51. "Estonia",
  52. "Finlandia",
  53. "Francja",
  54. "Grecja",
  55. "Hiszpania",
  56. "Holandia",
  57. "Irlandia",
  58. "Litwa",
  59. "Luksemburg",
  60. "Łotwa",
  61. "Malta",
  62. "Niemcy",
  63. "Polska",
  64. "Portugalia",
  65. "Rumunia",
  66. "Słowacja",
  67. "Słowenia",
  68. "Szwecja",
  69. "Węgry",
  70. "Wielka Brytania",
  71. "Włochy"
  72. };
  73. // zmienna do tworzenia nowych elemntów
  74. QStandardItem *itemCountry;
  75. foreach(QString country, ZSRE){
  76. itemCountry = new QStandardItem(country); // tworzę nową gałąź z nazwą z zmiennej country
  77. QBrush br(Qt::cyan); // tworzę brush z kolorem cyan jako wypełnienie
  78. QBrush brText(Qt::red); // tworzę brush z kolorem czerwonym jako wypełnienie
  79. itemCountry->setData(QVariant::fromValue(br), Qt::BackgroundRole); // ustawiam kolor tła
  80. itemCountry->setData(QVariant::fromValue(brText), Qt::ForegroundRole); // ustawiam kolor tekstu
  81. itemZSRE->setChild(itemZSRE->rowCount(), itemCountry); // dodaję element do gałęzi itemZSRE
  82. }
  83. // podpinam model pod kontrolkę treeView
  84. ui->treeView->setModel(treeViewModel);
  85. // ustawiam szerokość pierwszej kolumny
  86. ui->treeView->header()->resizeSection(0, 150);
  87. }
  88. MainWindow::~MainWindow()
  89. {
  90. delete ui;
  91. }
  92. void MainWindow::resizeEvent(QResizeEvent* event){
  93. QWidget::resizeEvent(event);
  94. QRect size = ui->centralWidget->geometry();
  95. // ustawiam szerokość i wysokość kontrolki treeView tak aby zajmowała obszar kontrolki centralWidget
  96. ui->treeView->setGeometry(0, 0, size.width(), size.height());
  97. }
Strony powiązane
strony powiązane
  1. doc.qt.io/qt-5/qt.html#ItemDataRole-enum - opis flag możliwych do użycia w metodzie setData obiektu klasy QTreeView dostępny na stronie Qt
  2. doc.qt.io/qt-5/qtreeview.html - opis klasy QTreeView dostępny na stronie Qt

Komentarze