Название: Помогите с делегатами) Отправлено: konstantin от Сентябрь 10, 2011, 14:33 Здравствуйте! Ранее обращался к вам на форум за советом, касающимся решения одной задачки.
Задачка такая: Есть таблица из 2 столбцов и N строк. Первый столбец нередактируемый, а ячейки второго столбца должны представлять из себя выпадающие списки. Мне посоветовали почитать про делегаты, что я и сделал. В общем-то проблему я решил, но... Есть пара неприятных моментов, от которых хотелось бы избавиться. За основу своей таблички брал пример "Spin Box Delegate Example". В редакторе формы использовал компонент QTableView. В коде устанавливал в него модель: model = new QStandardItemModel(14, 2); ui->tableProfile->setModel(model); TableView компонуется на форме по сетке, то есть, заполняет всю форму. При изменении размера формы, компонентTableView так же меняет свой размер, а вот ширина и высота столбцов в нем не меняется((( Как сделать так, чтобы размеры ячеек менялись с изменением размера формы? Вторая проблема связана с делегатом, а именно - с функцией setModelData. Мне нужно, чтобы она вызывалась при каждом выборе элемента списка. По умолчанию, она вызывается в двух случаях: При переходе с текущей ячейки, для которой вызван делегат, на другую ячейку; При закрытии формы. Как сделать так, чтобы она вызывалась при изменении элемента списка??? Название: Re: Помогите с делегатами) Отправлено: Rem Norton от Сентябрь 10, 2011, 21:17 По части ресайза:
есть такая хорошая штучка: Код: void QWidget::resizeEvent ( QResizeEvent * event ) А вот про делегата вопрос что-то не понял... как-то... совсем... вот, да... Что от делегата нужно то? Название: Re: Помогите с делегатами) Отправлено: konstantin от Сентябрь 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 | ---------------------------------------------------- параметр а | | ---------------------------------------------------- параметр б | | ---------------------------------------------------- Название: Re: Помогите с делегатами) Отправлено: popper от Сентябрь 12, 2011, 00:18 1) смотри QHeaderView::ResizeMode -> QHeaderView::Stretch
2) попробуй отследить изменения в таблице через сигнал QAbstractItemDelegate::closeEditor Название: Re: Помогите с делегатами) Отправлено: konstantin от Сентябрь 12, 2011, 11:53 C размерностью таблички я разобрался. Переопределил метод resizeEvent для класса QTableView. В нем получаю высоту и ширину объекта TableView, делю эти значения, на сколько нужно, а затем выставляю высоту строк и ширину столбцов в соответствии с полученными значениями. Над вторым вопросом думаю...
Название: Re: Помогите с делегатами) Отправлено: konstantin от Сентябрь 12, 2011, 11:55 По поводу closeEditor. Думается мне, что он вызывается при закрытии редактора. То есть, при переходе на другую ячейку таблицы. Это не подходит =(
Название: Re: Помогите с делегатами) Отправлено: konstantin от Сентябрь 12, 2011, 13:35 Уф) Проблему с делегатом решил =)
Сделал следующее: В функции setEditorData, инициализирующей выпадающий список значениями, установил соединение сигнала currentIndexChanged со своим слотом. В этом слоте инициализирую немодифицируемые ячейки. Теперь поведение таблички такое, какое требуется. Есть еще один момент, который хотелось бы прояснить. Дело вот в чем: Если я кликаю по модифицируемой ячейке, появляется редактор ввиде выпадающего списка. Если, затем, я кликаю по какой либо области окна программы вне моей таблички, а потом снова щелкаю на ту же ячейку таблицы, выпадающего списка в ней не появляется. Она просто засвечивается синим цветом и все. Название: Re: Помогите с делегатами) Отправлено: popper от Сентябрь 12, 2011, 13:51 а если переопределить
Код
и обновлять модель, если Код
|