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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Помогите с делегатами)  (Прочитано 4601 раз)
konstantin
Гость
« : Сентябрь 10, 2011, 14:33 »

Здравствуйте! Ранее обращался к вам на форум за советом, касающимся решения одной задачки.
Задачка такая: Есть таблица из 2 столбцов и N строк. Первый столбец нередактируемый, а ячейки второго столбца должны представлять из себя выпадающие списки. Мне посоветовали почитать про делегаты, что я и сделал. В общем-то проблему я решил, но... Есть пара неприятных моментов, от которых хотелось бы избавиться.

За основу своей таблички брал пример "Spin Box Delegate Example".
В редакторе формы использовал компонент QTableView. В коде устанавливал в него модель:

model = new QStandardItemModel(14, 2);
ui->tableProfile->setModel(model);

TableView компонуется на форме по сетке, то есть, заполняет всю форму. При изменении размера формы, компонентTableView так же меняет свой размер, а вот ширина и высота столбцов в нем не меняется((( Как сделать так, чтобы размеры ячеек менялись с изменением размера формы?

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

При переходе с текущей ячейки, для которой вызван делегат, на другую ячейку;
При закрытии формы.

Как сделать так, чтобы она вызывалась при изменении элемента списка???
Записан
Rem Norton
Гость
« Ответ #1 : Сентябрь 10, 2011, 21:17 »

По части ресайза:
есть такая хорошая штучка:
Код:
void QWidget::resizeEvent ( QResizeEvent * event )
Подробно описана в Qt Assistan, проблему решит.

А вот про делегата вопрос что-то не понял... как-то... совсем... вот, да...
Что от делегата нужно то?
Записан
konstantin
Гость
« Ответ #2 : Сентябрь 11, 2011, 20:30 »

По поводу столбцов таблицы, хочу сделать уточнение. Нужно, чтобы заданная структура таблицы (количество столбцов и строк) автоматом выравнивалась по всему объему компонента TableView. То есть, если у меня 2 столбца и три строки, то я хочу, чтобы они автоматом подгонялись под размер TableView, заполняя весь объем компонента. Мне казалось, что должно быть какое-то свойство у табличных классов, отвечающее за это. Во всяком случае, это было бы очень логично...

Теперь про делегат. Постараюсь изложить понятнее. Пусть имеется таблица из 2 столбцов и трех строк. При ее инициализации заполняется ячейка с индексом (0, 0). Первыя цифра - столбец, вторая - строка:

----------------------------------------------------
Тип устройства   |                                              |
----------------------------------------------------
                         |                                              |
----------------------------------------------------
                         |                                              |
----------------------------------------------------

При щелчке по ячейке с индексом (1, 0) появляется выпадающий список с двумя значениями: устройство 1 и устройство 2
далее пользователь выбирает из списка одно из значений щелчком мыши. По этому событию, в зависимости от выбранного варианта, должны проинициализироваься ячейки с индексами (0, 1) и (0, 2). То есть, для каждого типа устройства свои значения немодифицируемых полей. В справке по делегатам написано, что, как только пользователь осуществляет ввод данных в делегат, вызывается функция setModelData, которая отвечает за сохранение в модели введенных в делегат данных. В моем случае, мне нужно, чтобы, при выборе одного из пунктов выпадающего списка, щелчком правой кнопки мыши, ячейки с индексами (0, 1) и (0, 2) сразу же инициализировались, но этого не происходит, поскольку в данном случае функция setModelData не вызывается. В каких случаях она вызывается, я писал выше.

Получается такая хрень:

----------------------------------------------------
Тип устройства   |           тип 1                            |
----------------------------------------------------
                         |                                              |
----------------------------------------------------
                         |                                              |
----------------------------------------------------

А должно быть:

----------------------------------------------------
Тип устройства   |                    тип 1                   |
----------------------------------------------------
        параметр а  |                                              |
----------------------------------------------------
        параметр б  |                                              |
----------------------------------------------------
Записан
popper
Гость
« Ответ #3 : Сентябрь 12, 2011, 00:18 »

1) смотри QHeaderView::ResizeMode -> QHeaderView::Stretch

2) попробуй отследить изменения в таблице через сигнал QAbstractItemDelegate::closeEditor
Записан
konstantin
Гость
« Ответ #4 : Сентябрь 12, 2011, 11:53 »

C размерностью таблички я разобрался. Переопределил метод resizeEvent для класса QTableView. В нем получаю высоту и ширину объекта TableView, делю эти значения, на сколько нужно, а затем выставляю высоту строк и ширину столбцов в соответствии с полученными значениями. Над вторым вопросом думаю...
Записан
konstantin
Гость
« Ответ #5 : Сентябрь 12, 2011, 11:55 »

По поводу closeEditor. Думается мне, что он вызывается при закрытии редактора. То есть, при переходе на другую ячейку таблицы. Это не подходит =(
Записан
konstantin
Гость
« Ответ #6 : Сентябрь 12, 2011, 13:35 »

Уф) Проблему с делегатом решил =)

Сделал следующее:

В функции setEditorData, инициализирующей выпадающий список значениями, установил соединение сигнала currentIndexChanged со своим слотом. В этом слоте инициализирую немодифицируемые ячейки. Теперь поведение таблички такое, какое требуется.

Есть еще один момент, который хотелось бы прояснить. Дело вот в чем:

Если я кликаю по модифицируемой ячейке, появляется редактор ввиде выпадающего списка.
Если, затем, я кликаю по какой либо области окна программы вне моей таблички, а потом
снова щелкаю на ту же ячейку таблицы, выпадающего списка в ней не появляется. Она просто засвечивается синим цветом и все.
Записан
popper
Гость
« Ответ #7 : Сентябрь 12, 2011, 13:51 »

а если переопределить
Код
C++ (Qt)
bool QAbstractItemDelegate::editorEvent ( QEvent * event, QAbstractItemModel * model,
                      const QStyleOptionViewItem & option, const QModelIndex & index ) [virtual]
 
           
и обновлять модель, если
Код
C++ (Qt)
e->type() == QEvent::MouseButtonRelease
 
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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