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

Работа с QTreeView

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


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






Виртуальный хостинг со скидкой 10 процентов
Виртуальный хостинг со скидкой 10 процентов
EVILEG предлагает надёжный хостинг со скидкой 10% на виртуальный хостинг и 5% на VPS
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

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
МБ
21 апреля 2019 г. 9:40
Моисей Бушуев

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

  • Результат:0баллов,
  • Очки рейтинга-10
AA
17 апреля 2019 г. 19:40
Anton Ablin

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

  • Результат:73баллов,
  • Очки рейтинга1
E
17 апреля 2019 г. 18:16
Evgeny

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

  • Результат:100баллов,
  • Очки рейтинга10
Последние комментарии
21 апреля 2019 г. 16:22
Евгений Легоцкой

Через метод setIcon table.horizontalHeaderItem(0).setIcon("qrc://path/to/icon.png")
21 апреля 2019 г. 15:48
Евгений Легоцкой

Добрый день! Спасибо за комментарий. Там действительно лучше будет сделать с инициализацией по умолчанию.
U
18 апреля 2019 г. 15:37
Unreal_man

А как иконку в хедер задать?
u
18 апреля 2019 г. 2:15
uaa

доброго времени,большое спасибо за пример для начинающего)при адаптации к своему проекту столкнулся с таким ньансом:в vepolyline.h в 47 строке нужна инициализация по умолчанию: int m_pointF...
E
11 апреля 2019 г. 12:49
Evgeny

Спасибо за ответ) У меня компоновщик на нее ругался просто. Оказалось, просто забыл Q_OBJECT в начале класса указать.
Сейчас обсуждают на форуме
23 апреля 2019 г. 18:39
BlinCT

Вопрос закрыт) проблема найдена
21 апреля 2019 г. 16:16
Евгений Легоцкой

Приветствую Нужно сохранять где-то выбранное значение, а потом восстанавливать его. Или использовать QSettings или добавить метод open(), в который передавать начальные значения для того...
R
19 апреля 2019 г. 9:55
RED_Spider

мені важко це зараз навіть перевірити, тому що знайшов коміт, це ще було в 2016 році, і цей код не буде працювати коректно зараз, єдине скажу що це були QThread
i
17 апреля 2019 г. 15:03
ilya.guzikov

BlinCT, на стороне ++ это делать необходимо так как в qml при использовании функции append происходит перерисовка всех точек лини(как я понимаю) и из-за этого при использовании больших массиво...
Присоединяйтесь к нам в социальных сетях

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