crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

dexter_man
  опции профиля:
сообщение 12.5.2008, 16:16
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 16
Регистрация: 12.5.2008
Пользователь №: 173

Спасибо сказали: 0 раз(а)




Репутация:   0  


Помогите реализовать QTreeView:
Модель данных выглядит седуюцим образом

Здание 1 1
|-----Комната 1 1
Здание 2 1
|-----Комната 1 1
Здание 3 3
|-----Комната 1 2
|-----Комната 2 1
|-----Комната 3 1

Короче получается обычное дерево.
например когда выбирается "Здание 3" и вводится кол-во комнат (с помошью QSpinBox), например 3 , то добавляется введенное количество комнат.


Посоветуйте с чего хоть начать, в программирование полный профан!!!
Каким образом это хоть можно сделать???
И каким оразом реализовть модель/представление???
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
3 страниц V   1 2 3 >  
Начать новую тему
Ответов (1 - 21)
Litkevich Yuriy
  опции профиля:
сообщение 12.5.2008, 16:27
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(dexter_man @ 12.5.2008, 20:16) *
например когда выбирается "Здание 3" и вводится кол-во комнат (с помошью QSpinBox), например 3 , то добавляется введенное количество комнат.

это типа в отдельном диалоге? потом нажимаем ок, и должны увидеть дерево?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
dexter_man
  опции профиля:
сообщение 12.5.2008, 16:31
Сообщение #3


Студент
*

Группа: Новичок
Сообщений: 16
Регистрация: 12.5.2008
Пользователь №: 173

Спасибо сказали: 0 раз(а)




Репутация:   0  


Нет, все в этом же диалоге!
Комнаты добавляются динамически.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 12.5.2008, 16:34
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


а где в дереве должен быть спинбокс, в одной из колонок родительского элемента?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
dexter_man
  опции профиля:
сообщение 12.5.2008, 16:43
Сообщение #5


Студент
*

Группа: Новичок
Сообщений: 16
Регистрация: 12.5.2008
Пользователь №: 173

Спасибо сказали: 0 раз(а)




Репутация:   0  


Примерно вот так должно выглядить так!
Напротив здания вводтся должно количество комнат и они должны автоматически добавляться и удаляться соответственно

Сообщение отредактировал dexter_man - 12.5.2008, 16:46
Эскизы прикрепленных изображений
 Р В Р’ Р’ Р в‚¬Р В РЎВ˜Р В Р’µР Р…ьшено Р Т‘Р С• 48%
Прикрепленное изображение
510 x 360 (15.62 килобайт)
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
dexter_man
  опции профиля:
сообщение 12.5.2008, 20:48
Сообщение #6


Студент
*

Группа: Новичок
Сообщений: 16
Регистрация: 12.5.2008
Пользователь №: 173

Спасибо сказали: 0 раз(а)




Репутация:   0  


Хоть с чего-то начать?
Каким образом реализовать новую модель под мои нужды? Я просто тему "Модель/Представление" не понимаю вообще (((
И еще к тому же ангрийского не знаю (((

Сообщение отредактировал dexter_man - 12.5.2008, 20:49
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 12.5.2008, 20:56
Сообщение #7


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Я тебе могу помочь в этом, но только завтра, так как сейчас времени нет.

Цитата(dexter_man @ 12.5.2008, 21:48) *
И еще к тому же ангрийского не знаю (((
А для чего мы переводим спрашивается документацию? :)

Читай на русском языке: Программирование Модель/Представление
Если будет что-то не понятно, спрашивай, поможем. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 12.5.2008, 21:01
Сообщение #8


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


я так прикинул, тут самое главное делегат свой какчественно сделать на основе спинбокса, в момент когда редактирование завершится, фокус с него уйдет, надо чтобы помимо обновления данных в модели еще и n подветвей создавалось.

dexter_man, почитай то, что ViGOur дал про концепцию, делегаты (я не доперевел ;) ) и потом глянь этот пост, я как-то ваял на тему делегатов, может пригодится.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
dexter_man
  опции профиля:
сообщение 12.5.2008, 21:04
Сообщение #9


Студент
*

Группа: Новичок
Сообщений: 16
Регистрация: 12.5.2008
Пользователь №: 173

Спасибо сказали: 0 раз(а)




Репутация:   0  


Да я его уже читал на русском языке в переведенной документации и в книге М.Шлее и в книге Бланшета читал, нихрена не понял переопределение функций когда создаешь новую модель, либо делегат! Наверное я очень туп!
Просто уже неделю сижу не могу сделать (((
Скоро крыша поедет...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 12.5.2008, 21:11
Сообщение #10


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


тогда смотри указаный мной пост, я тоже тупил :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
dexter_man
  опции профиля:
сообщение 12.5.2008, 21:13
Сообщение #11


Студент
*

Группа: Новичок
Сообщений: 16
Регистрация: 12.5.2008
Пользователь №: 173

Спасибо сказали: 0 раз(а)




Репутация:   0  


Если делать модель QAbstractItemModel то обязательно переопределять все функции?

Спасиба посмотрел ща попробую разобраться с кодом!!!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 12.5.2008, 21:21
Сообщение #12


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


---
Представление, напримере табличного, можно так вообразить:
Натянута сетка, как волейбольная, в ней ячейки, в ячейке отображаются цифирки, буковки или вовсе картинки. Если надо поменять в ячейке содержимое, т.е. человек в ячейку ручками полез, туда быстренько подсовывается устройство - делегат. Оно занает как менять, в первы момент делегат узнает у модели данные, передав ей координаты - модельный индекс, затем показывает себя с этими данными, и человек уже работает с делегатом, потом когда фокус от я чеки уходит, делегат отправляет данные в модель, опять же с помощью координат - модельного индекса. А сам убегает, на его месте представление показывает то что сейчас в модели.

Цитата(dexter_man @ 13.5.2008, 1:13) *
Если делать модель QAbstractItemModel то обязательно переопределять все функции?

ненадо тебе модель делать, тебе надо делегат делать, который, когда будет убегать из сетки, помимо того что данные в модель запишит, еще и подветок нужное кол-во в модели создаст, и все убежит, а когда убежит представление у модели спросит "как там с данными?", а модель ему свежачек подкинет.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
dexter_man
  опции профиля:
сообщение 12.5.2008, 21:29
Сообщение #13


Студент
*

Группа: Новичок
Сообщений: 16
Регистрация: 12.5.2008
Пользователь №: 173

Спасибо сказали: 0 раз(а)




Репутация:   0  


Пасиба!!! Ща буду пробывать!
Вы вдохнули в меня оптимизм!!! :i_am_so_happy:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
dexter_man
  опции профиля:
сообщение 13.5.2008, 13:14
Сообщение #14


Студент
*

Группа: Новичок
Сообщений: 16
Регистрация: 12.5.2008
Пользователь №: 173

Спасибо сказали: 0 раз(а)




Репутация:   0  


А как прописать в делегате:
if(пальзователь выбрал например здание 1 второй столбец)
    {
        QSpinBox *editor = new QSpinBox(parent);
        editor->setMinimum(1);
        editor->setMaximum(100);
// еще код
        return editor;
    }
else if (если пользователь выбрал подтаблицу с комнатами столбец 1)
{
//еще код
}
    else
        return QItemDelegate::createEditor(parent, option, index);
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 13.5.2008, 13:51
Сообщение #15


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Вообщем в представлении в каждой ячеку по делегату, если пользователь выбрал какое-то место, то его координаты (модельный индекс ) передаются в делегат:
setEditorData(QWidget *editor, const QModelIndex &index) const
setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const

в представлении ты для конкретного столбца можешь установить конкретный делегат, поэтому в делегате не надо анализировать "если столбец..." Просто сделай делегат для такого столбца.

т.е. ты сделал делегат который будет подветви добавлять к текущей ветви, и назвал его AddDelgate, тогда код его использования выглядит так:
    // создадим делег AddDelgate
    AddDelgate myadddelegate;
    ...
    tableView.setItemDelegateForColumn(1, &myadddelegate);// переопределим делегат для первого столбца->мой
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
dexter_man
  опции профиля:
сообщение 13.5.2008, 13:53
Сообщение #16


Студент
*

Группа: Новичок
Сообщений: 16
Регистрация: 12.5.2008
Пользователь №: 173

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата
Вообщем в представлении в каждой ячеку по делегату, если пользователь выбрал какое-то место, то его координаты (модельный индекс ) передаются в делегат:

Это я уже понял
Я просто хотел сделать по другому

Я все понял, ща буду делать

Сообщение отредактировал dexter_man - 13.5.2008, 13:55
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
dexter_man
  опции профиля:
сообщение 13.5.2008, 14:27
Сообщение #17


Студент
*

Группа: Новичок
Сообщений: 16
Регистрация: 12.5.2008
Пользователь №: 173

Спасибо сказали: 0 раз(а)




Репутация:   0  


а в какую функию вставить connect(spinBox, SIGNAL(valueChanged(int)), SLOT(add_column(int)))?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 13.5.2008, 14:47
Сообщение #18


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(dexter_man @ 13.5.2008, 15:27) *
а в какую функию вставить connect(spinBox, SIGNAL(valueChanged(int)), SLOT(add_column(int)))?

По идее лучше всего в конструктор!!!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
dexter_man
  опции профиля:
сообщение 13.5.2008, 15:06
Сообщение #19


Студент
*

Группа: Новичок
Сообщений: 16
Регистрация: 12.5.2008
Пользователь №: 173

Спасибо сказали: 0 раз(а)




Репутация:   0  


Мне нужно в делегате указать что если пользователь выбирает на против здания количество комнат, чтоб добавлялось звдвнное количество строк в подтаблицу.
Вот я не знаю каким образом реализовать этот слок, ведь в него должны передаваться в качестве параметров: модель и индекс.
void add_column(int n, QAbstractItemModel *model, const QModelIndex &index);

И в какую функцию делегата его запихнуть?

Сообщение отредактировал dexter_man - 13.5.2008, 15:09
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 13.5.2008, 17:16
Сообщение #20


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


я думаю сигналы со слотами тут лишние, можно в функции делегата setModelData() это реализовать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
dexter_man
  опции профиля:
сообщение 13.5.2008, 17:24
Сообщение #21


Студент
*

Группа: Новичок
Сообщений: 16
Регистрация: 12.5.2008
Пользователь №: 173

Спасибо сказали: 0 раз(а)




Репутация:   0  


для добавления строк нужно вызвать функцию insertRow( int row, const QModelIndex & parent = QModelIndex() ) ?
и еще, че эт за функия: void * QModelIndex::internalPointer () const ?

Сообщение отредактировал dexter_man - 13.5.2008, 17:26
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 13.5.2008, 18:54
Сообщение #22


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


я тут подумал, как вариант можно вообще упростить решение, положим у тебя изначально забиты какие-то данные, когда ты будешь рекликать в цифирку, у тебя автоматом подставится виджет поумолчанию, ты изменишь цифирку, нажмешь энтер, модель пошлет сигнал dataChanged(), поймай его и добавь нужное кол-во дочерних строчек. Может так тебе будет проще!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

3 страниц V   1 2 3 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 6.5.2025, 13:12