Политика конфиденциальностиКонтактыО сайтеОтзывы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

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
IO
20 января 2019 г. 18:39
Ivan Otreshko

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

  • Результат:0баллов,
  • Очки рейтинга-10
IO
20 января 2019 г. 15:27
Ivan Otreshko

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

  • Результат:0баллов,
  • Очки рейтинга-10
v
17 января 2019 г. 11:51
vitalir12

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:20баллов,
  • Очки рейтинга-10
Последние комментарии
I
16 января 2019 г. 8:06
IscanderChe

Заработало. Забыл model->select(); вписать.
I
16 января 2019 г. 8:02
IscanderChe

Всё равно пусто, хотя строка с данными в базу добавляется.
16 января 2019 г. 7:51
Евгений Легоцкой

потому, что нужно сохранять информацию для всех остальных ролей и столбцов через вызов переопределённого метода. Да к тому же вы ещё и зациклили вызов метода data. QVariant MySqlTableModel:...
I
16 января 2019 г. 7:43
IscanderChe

Сделал вот так. В tableView ничего нет, кроме заголовка. QVariant MySqlTableModel::data(const QModelIndex &index, int role) const{ if (role == Qt::DisplayRole) { QTime ...
Сейчас обсуждают на форуме
21 января 2019 г. 16:28
Михаиллл

Добрый день.Почему работая на С++, нельзя полноценно использовать dll , написанных на C#, java?И почему используя другие языки, можно использовать dll , написанных на C++?
21 января 2019 г. 16:24
Михаиллл

Нашел ссылку на древние типы данных , а тут нынешние их аналоги.Но все равно каое что непоня:что такое : LPCTSTR, CALLBACK (наверно QDialig),IDOK, EDITSTREAM, TCHARКод...
21 января 2019 г. 14:30
Евгений Легоцкой

Порядок создания тем - пункт 4
ПБ
21 января 2019 г. 9:23
Павел Богдевич

Ребята, привет. Это 2 версии одного приложения. Отличаются только способом инициализации таблицы. В одной версии работает сортировка таблицы, когда кликаешь по хедеру колонки, в другой - нет. ...
21 января 2019 г. 7:36
Евгений Легоцкой

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

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