© EVILEG 2015-2018
Рекомендует хостинг
TIMEWEB
25 августа 2018 г. 16:41

Работа с QTreeView

Добрый вечер.


Хочу реализовать справочник номенклатуры, с разделами и подразделами. Данные хочу брать из базы данных.  Примеры с запросами из БД не нашел.






  • #
  • 26 августа 2018 г. 10:52
Тут посмотрите

Спасибо. В данной статье описывается tableView

Сам с QTreeView не работал, но рискну предположить, что реализация примерно такая же, как и в QTableView, т.е. по сигналу clicked(QModelIndex) или doubleClicked(QModelIndex), где QModelIndex - индекс ячейки в таблице, в вашем случае - дерева.

connect(ui->treeView, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(openTree(QModelIndex)));
в слот пихаем SQL-запрос
void ClassTree::openTree(const QModelIndex & index)
{
    QString str, //строка для запроса
                  nameString, //строка в которой получаем значение таблицы
                  can;

    QSqlQueryModel *modelDiagram;

    modelDiagram = new QSqlQueryModel(this);
//Получаем значение ячейки ID--- nameString = index.model()->data(index.model()->index(index.row(), index.column())).value<QString>();
can = index.model()->data(index.model()->index(index.row(), index.column())).value<QString>();
//Формируем запрос--- str = "SELECT " "DataBaseName.Column1, " "FROM DataBaseName " "WHERE DataBase.Row='" + nameString + "'";//где DataBaseName - ваша БД, в данном случае //состоит из одной таблицы modelDiagram->setQuery(str); while (modelDiagram->canFetchMore())//Считываем все строки из таблицы { //если количество строк больше 256 modelDiagram->fetchMore(); } creatTree();//- функция в которой настраивается внешний вид QTreeView, ну там растяжения всякие и //т.д. }
проверить сейчас нет возможности, попробуйте, может получится

А как мне с родителями и детьми быть, если у меня будем много узлов?



QModelIndex & index - возвращает индекс ячейки по которой кликнули мышкой.

В строке 

nameString = index.model()->data(index.model()->index(index.row(), index.column())).value<QString>();

мы получаем значение, которое записано в этой ячейке. Это значение мы вставляем в строку запроса SQL - это для родителя. Примерно такой же код (для получения значения значения ячейки) пишете для дитяти. Значение nameString нам уже известно - передаете его в функцию для childrena

nameStringChildren = index.model()->data(index.model()->index(index.row(), index.column())).value<QString>();
а запрос будет
 strChaild = "SELECT "
          "DataBaseName.Column6,   "
          "FROM DataBaseName       "
          "WHERE DataBase.Row='" + nameString + "'" + "AND CHAILDTABLE='" + nameStringChildren + "'";//CHAILDTABLE - условное название для

 интересующей нас колонки

т.о. в запросе у вас уже 2 параметра.

Работает?

Так и не получается. Мне нужно с начало загрузить всех родителей, а потом по клику мыши подгружать детей, так? Вопрос как обновить модель уже с детьми? Как сделать две колонки?


void ReferenceGoods::UpdateTree()
{
standardModel = new QStandardItemModel ;
    QStandardItem * preparedRow = new QStandardItem();

    preparedRow = standardModel->invisibleRootItem();
    QList<QStandardItem *> rowItems ;

    QStandardItem * preparedColumn = new QStandardItem();
    QList<QStandardItem *> columnItems ;

    QSqlQuery * tree_goods1 = new QSqlQuery();
    tree_goods1->prepare("SELECT id_ref_goods, name_ref_goods  FROM ref_goods");
     if(tree_goods1->exec()){
        while(tree_goods1->next()){
                columnItems  << new QStandardItem(tree_goods1->value(0).toString());
                rowItems  << new QStandardItem(tree_goods1->value(1).toString());
        }
    } else {
        qDebug() << "Ошибка построения списка: " + tree_goods1->lastError().text();
    }

      preparedRow->appendRows(rowItems);
      ui->treeView->setModel(standardModel);
      ui->treeView->expandAll();

 }

Ответы

Только авторизованные пользователи могут отвечать на форуме.
Пожалуйста, Авторизуйтесь или Зарегистрируйтесь
24 сентября 2018 г. 17:42
edorofeeva

C++ - Тест 001. Первая программа и типы данных

  • Результат 100баллов,
  • Очки рейтинга10
24 сентября 2018 г. 17:37
edorofeeva

C++ - Тест 001. Первая программа и типы данных

  • Результат 66баллов,
  • Очки рейтинга-1
23 сентября 2018 г. 14:38
No Names

C++ - Тест 001. Первая программа и типы данных

  • Результат 60баллов,
  • Очки рейтинга-1
Последние комментарии
25 сентября 2018 г. 15:24
pasagir

Qt/C++ - Урок 006. QSqlQueryModel - Таблицы в Qt с помощью SQL-запросов

Это запись метода которая работает параллельно с БД, данные из парсера поступают в БД и в наш метод одновременно
25 сентября 2018 г. 14:56
pasagir

Qt/C++ - Урок 006. QSqlQueryModel - Таблицы в Qt с помощью SQL-запросов

Как можно динамически отображать данные в таблице? На COM-порт непрерывно приходят данные, я их принимаю сохраняю в БД, а после остановка приема/передачи данные отображаются в таблице. В табли...
25 сентября 2018 г. 10:43
Евгений Легоцкой

Qt/C++ - Урок 017. QGraphicsScene или как работать с графикой в Qt

Прямо так не написано. Хотя соглашусь, что в качестве улучшения вызов данного метода здесь к месту.
25 сентября 2018 г. 10:37
reef425

Qt/C++ - Урок 017. QGraphicsScene или как работать с графикой в Qt

В статье написано, что таймер сработает один раз. Но это не так. Было бы хорошо добавить timer->setSingleShot(true); После инициализации таймера.
24 сентября 2018 г. 15:09
Евгений Легоцкой

Qt Linux - Урок 001. Автозапуск Qt приложения под Linux

А вот здесь у меня есть пример использования supervisor. https://evileg.com/ru/post/3/ Вся статья вам там не интересна, интересен только шаг с настройкой supervisor. Он получается ...
Сейчас обсуждают на форуме
25 сентября 2018 г. 15:57
Евгений_Канусовский@1981

Чтение файлов в python

Вот код: import sys from re import matchfrom vira import *from PyQt5 import QtCore, QtGui, QtWidgetsfrom PyQt5.QtWidgets import (QDialog, QFileDialog, QMessageBox, QLineEdit, QProgr...
25 сентября 2018 г. 13:51
DmitrySD

Трансляция видео с помощью VLC по RTP

Спасибо! Данная команда не дала результата. В итоге сделал трансляцию через ffmpeg. ffmpeg.exe -f gdigrab -framerate 30 -i desktop -vcodec libx264 -preset:v veryfast -b:v 4000k -f...
25 сентября 2018 г. 13:39
Arrow

Настройка Qt Creator для Android

Конечно отпишусь.
25 сентября 2018 г. 12:22
avovana

Автозапуск и авторестарт Qt Gui Application в Linux

Не получается... Решил пробовать скрипт, выполняемый при загрузке. В скрипте вечный цикл по старту программы.
Присоединяйтесь к нам в социальных сетях