Политика конфиденциальностиКонтактыО сайтеОтзывыGitHubDonate
© EVILEG 2015-2018
Рекомендует хостинг
TIMEWEB
25 августа 2018 г. 16:41

Работа с QTreeView

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


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






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

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

0

Сам с 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, ну там растяжения всякие и //т.д. }
проверить сейчас нет возможности, попробуйте, может получится
0

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



0
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 параметра.
0

Работает?

0

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


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();

 }
0

Ответы

Только авторизованные пользователи могут отвечать на форуме.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
18 ноября 2018 г. 19:19
cyrillwork

Qt - Тест 001. Сигналы и слоты

  • Результат:78баллов,
  • Очки рейтинга2
16 ноября 2018 г. 19:09
Илья Завьялов

Qt - Тест 001. Сигналы и слоты

  • Результат:31баллов,
  • Очки рейтинга-10
16 ноября 2018 г. 12:49
Ирина Минигузина

C++ - Тест 003. Условия и циклы

  • Результат:0баллов,
  • Очки рейтинга-10
Последние комментарии
16 ноября 2018 г. 6:50
Евгений Легоцкой

Добрый день! шаблон не находит, или шаблон неправильно прописали, или тег шаблона неправильно написан, иных выводов сделать не могу, из того, что вы написали. трейсбек нужно смотреть. Со...
16 ноября 2018 г. 6:48
Евгений Легоцкой

пройтись циклом по всем виджетам в обратном порядке for (int i = ui->vertialLayout->count() - 1; i >= 0; --i){ QWidget* w = ui->verticalLyout->itemAt(i)->widget();...
15 ноября 2018 г. 21:35
chunk

Доброго времени суток Евгений. Не подскажете что я делаю не так? Получаю ошибку такого характера: Reverse for 'add_comment' with arguments '('',)' not found. 1 pattern(s) tried: ...
15 ноября 2018 г. 15:35
Михаиллл

Спасибо. Похоже где то описку сделал, поэтому не работало. Я добавил на verticalLayout много виджитов. А можно ли их как то быстро и просто удалить?
15 ноября 2018 г. 14:55
Евгений Легоцкой

verticalLayout - это, по-моему предположению, должен быть у вас объект класса QVBoxLayout, который наследован от QBoxLayout. Поэтому открываете документацию на QVBoxLayout ...
Сейчас обсуждают на форуме
18 ноября 2018 г. 18:11
Metelev

Большое спасибо, все получилось, завтра начну изучать код.
18 ноября 2018 г. 17:49
Чарльз Грин

Спасибо, буду разбераться
17 ноября 2018 г. 14:13
Чарльз Грин

Я сейчас занимаюсь мультимедией, это аудио и видео, программы для концертов и т. д. Бибилиотека Qt очень помогает, она надежная, а надежность в моих приложениях очень важный фактор чтоб не пол...
16 ноября 2018 г. 16:28
Евгений Легоцкой

Добрый день! Спасибо, что воспользовались именно форумом. Заниматься курсовыми работами чьими-то ни было у меня времени нет, у самого полторы работы. Но что-то подсказать на фо...
Присоединяйтесь к нам в социальных сетях

Для зарегистрированных пользователей на сайте присутствует минимальное количество рекламы