Russian Qt Forum
Ноябрь 24, 2024, 06:40 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: QTreeView и база данных  (Прочитано 16671 раз)
crocus
Гость
« Ответ #15 : Июнь 12, 2008, 12:06 »

Чтобы не создавать новую ветку по TreeView.
Вопрос в следующем: если в treeview выставить QAbstractItemView::SelectionMode в MultiSelection, получаем как на скрине ниже
мне кажется что было бы логично при селекте какого-либо дочернего итема, с родительского итема селект автоматически снимался - например в данном случае, если мы будем осуществлять запрос к БД, то получим не только искомое (дочернюю ветвь- Фолиант5), а полностью, включая родительскую ветвь - Фолиант. Конечно, можно руками деселектить родителя, но полагаю для рядового пользователя это будет непосильной задачей Улыбающийся. К тому же при doubleclick по итему (чтобы раскрыть ветвь) происходит и выделение итема. Есть конечно вариант перехвата QEvent::MouseButtonDblClick и блокировки селекта, но это как-то не на поверхности.
В общем сталкивался ли кто с подобным  вопросом и существуют ли простые методы решения.
« Последнее редактирование: Июнь 12, 2008, 12:22 от crocus » Записан
Sergey B.
Программист
*****
Offline Offline

Сообщений: 544



Просмотр профиля WWW
« Ответ #16 : Июнь 13, 2008, 09:58 »

Вот так работает...
Название столбцов и таблиц - изменены, но структура сохранена!


Код:
void MyDialog::BuildTree(){

QSqlQuery cities, districts;
bool ok=cities.exec("SELECT cityname FROM cities ORDER BY cityname;");
if (!ok) {
QMessageBox::warning(this, tr("SuperProga"), cities.lastError().text());
return;
}

model=new QStandardItemModel(this);
QStandardItem *parentItem = model->invisibleRootItem();

while(cities.next()){
QStandardItem *item = new QStandardItem(QString("%0").arg(cities.value(0).toString()));
parentItem->appendRow(item);
   
  districts.prepare("SELECT disname FROM districts WHERE CityID=(SELECT ID FROM cities WHERE cityname LIKE :city) ORDER BY disname;");
  districts.bindValue(":city", cities.value(0).toString());
  bool disok=districts.exec();
  if (!disok) {
  QMessageBox::warning(this, tr("SuperProga "), districts.lastError().text());
return;
}
  while(districts.next()){
QStandardItem *itemchild = new QStandardItem(QString("%0").arg(districts.value(0).toString()));
item->appendRow(itemchild);

  }
 


}
model->setHeaderData(0, Qt::Horizontal, tr("Cities"));
treeView->setModel(model);
treeView->setAlternatingRowColors(true);
treeView->setEditTriggers(QAbstractItemView::NoEditTriggers);
}

Это для двух уровневой структуры. Если надо больше, то после:
Код:
parentItem->appendRow(item);

пишешь:
Код:
parentItem = item;
и т.д.
В Assistant посмотри по QStandardItemModel, там всё хорошо расписано.
« Последнее редактирование: Июнь 13, 2008, 10:06 от Sergey B. » Записан
crocus
Гость
« Ответ #17 : Июнь 13, 2008, 10:07 »

Да, отлично, я на основе http://vitaljkapblog.livejournal.com/65648.html , нечто похожее сделал.
Записан
crocus
Гость
« Ответ #18 : Июнь 18, 2008, 03:42 »

Вопрос о выделении слишком прост?, слишком сложен? или никому не нужен?, в принципе решение найдено и работает, но хотелось бы увидеть полет мысли участников форума.
Записан
kolob
Частый гость
***
Offline Offline

Сообщений: 296



Просмотр профиля
« Ответ #19 : Июль 29, 2011, 16:14 »

Не хотелось плодить тем двойником. Поэтому вопрос: кто как создает иерархическую модель?
Т.е. есть таблица БД элементарного вида id, parent_id, value. Нужно отобразить иерархию в TreeView.
В голове возникают различные мысли. Вот такие:
1. Выгружать все в контейнер вида QMap <int, QMap<int, QString>> и дальнейшими манипуляциями создавать модель типа QStandardItemModel.
2. Частично 1-й вариант, только создать класс унаследованный от QStandardItemModel и скормить ему данный контейнер.
3. Создать рекурсивную функцию.
4. Создавать каждый элемент по порядку из результата запроса.
Ну вот как то так. Не ругайте сильно, если где то я не понятно выразился. Это только мысли. И на Qt4 делаю только первый проект. Поэтому теорию по модель - представление познал только недавно.
Записан

Qt 5.11.0, Win, MinGW
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.121 секунд. Запросов: 23.