Russian Qt Forum

Qt => Model-View (MV) => Тема начата: neosapient от Август 25, 2009, 13:32



Название: [Решено?] Помогите настроить реакцию кнопок в столбце.
Отправлено: neosapient от Август 25, 2009, 13:32
Здравствуйте.

Сделал таблицу QTableWidget, со столбцами: стандартный, QLineEdit, QComboBox, QPushButton.
(http://pic.ipicture.ru/uploads/090825/73PGSJZ9N3.jpg) (http://ipicture.ru/)

Первые три столбца реагируют на редактирование в соответствии с ожиданиями.
Проблема с столбцом кнопок, при кликах не вызывается QItemDelegate::setModelData()

Я хочу сделать так, чтобы при нажатии на кнопку было два состояния: кнопка отжата и надпись Lock, кнопка зажата (залипла) и надпись Work.

Исходник в приложении


Название: Re: Помогите настроить реакцию кнопок в столбце.
Отправлено: neosapient от Август 28, 2009, 00:28
Есть у кого-нибудь идеи, как настроить обработчики кнопки в таблице/модели ?


Название: Re: Помогите настроить реакцию кнопок в столбце.
Отправлено: neosapient от Декабрь 15, 2009, 17:15
Вернулся к этой задаче. Очень хочу услышать вашу конструктивную критику по выбраному мной способу.

Решением стала разработка наследника QPushButton.
Чтобы кнопка залипала в конструкторе наследника устанавливаю флаг setCheckable(true). Так же поставил перехват сигнала toggled(bool) от кнопки, при изменении которого пишу текст "Work/Lock". В методе делегата QItemDelegate::setModelData()

Насколько я понял, Делегат переходит в режим редактирования когда содержащая его ячейка получает фокус и клик мышкой/<Enter>.  Точно также делегат выходит из режима редактирования, когда фокус с ячейки убирается. Сейчас кнопка доступна для кликов, но как в случае обычного комбобокса, выбранное значение возвращается в QItemDelegate::setModelData() только при смене фокуса.

Как программно из делегата сменять фокус внутри QTableView ?


Название: Re: [Решено?] Помогите настроить реакцию кнопок в столбце.
Отправлено: Marat(Qt) от Декабрь 26, 2009, 18:40
отошлите из делегата сигнал, например:
Код:
emit needChangeFocus();
когда задаете делегата таблице:
Код:
MyDelegateClass *deleg = new MyDekegateCkass(ui->tableView);
ui->tableView->setItemDelegate(deleg);
connect(deleg,SIGNAL(needChangeFocus()),this,SLOT(changeFocus());
в слоте changeFocus делайте что в голову придет, если у tableView есть нужный вам слот - можете прямо к нему сигнал прицепить