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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Передать сигнал после завершения редактирования через QStyledItemDelegate  (Прочитано 4299 раз)
vintik
Гость
« : Март 28, 2013, 16:54 »

Всем привет!
Подскажите пожалуйста, есть ли какой-то не костыльный способ проделать следующую вещь.

Есть класс MegaForm.
Он содержит 2 вьюхи. view1 и view2.
Для каждой из них назначен делегат MyDelegate.

Хочу уметь получать в классе MegaForm уведомление об изменении данных в любой из вьюх(в уведомлении должны быть и сами данные),
только в том случае, если данные были изменены через edit виджет делегата (в моём случае это QLineEdit)

Спасибо!
« Последнее редактирование: Март 28, 2013, 17:12 от vintik » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Март 28, 2013, 17:10 »

В своей отнаследованной вьюхе добавь сигнал
Код
C++ (Qt)
Q_SIGNALS:
void commitData( QWidget* editor );
При регистрации делегата за-коннекть сигнал делегата на этот сигнал
Код
C++ (Qt)
connect( your_delegate, SIGNAL( commitData(QWidget*) ), this_of_your_view, SIGNAL( commitData(QWidget*) ) );
 
В MegaForm коннекться к YourView::commitData(QWidget* ).
Записан

Qt 5.11/4.8.7 (X11/Win)
vintik
Гость
« Ответ #2 : Март 28, 2013, 17:13 »

Да, мысль понял, но небольшая ремарка..
Под данными я подразумеваю, то что отображается в ячейках вьюх - это некий ключ (QString) и значение (double). QLineEdit
редактирует только double из  этой пары. Но при изменении данных в MegaForm мне нужно получить именно пару ключ и значение.
А через указатель на QWidget* я смогу только к содержимому QLineEdit добраться..

Или завести в QLineEdit какой-нить проперти, куда сохранить значение ключа?
« Последнее редактирование: Март 28, 2013, 17:15 от vintik » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #3 : Март 28, 2013, 17:25 »

Или завести в QLineEdit какой-нить проперти, куда сохранить значение ключа?
Именно.
Перегрузи
Код
C++ (Qt)
QWidget* QStyledItemDelegate::createEditor( QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index ) const [virtual]
в котором и навешивай, например, через
Код
C++ (Qt)
bool QObject::setProperty( const char* name, const QVariant& value )
всё что хочешь.
Записан

Qt 5.11/4.8.7 (X11/Win)
vintik
Гость
« Ответ #4 : Март 28, 2013, 17:28 »

GreatSnake, Спасибо большое!

Выкладываю решение, возможно пригодится кому
В своей версии Qt 4.8.3 не нашёл у вьюх сигнала SIGNAL(commitData(QWidget*)).
Сделал MyView в который добавил сигнал
Код:
Q_SIGNALS:
    void commit_data(QWidget *editor);

В MegaForm делаю коннект
Код:
MyDelegate *delegate1 = new MyDelegate();
connect(delegate1, SIGNAL(commitData(QWidget*)), view1, SIGNAL(commit_data(QWidget*)));
connect(view1, SIGNAL(commit_data(QWidget*)), this, SLOT(mega_slot1(QWidget*)));

MyDelegate *delegate2 = new MyDelegate();
connect(delegate2, SIGNAL(commitData(QWidget*)), view2, SIGNAL(commit_data(QWidget*)));
connect(view2, SIGNAL(commit_data(QWidget*)), this, SLOT(mega_slot2(QWidget*)));
Слот в MegaForm выглядит примерно так
Код:
void MegaForm::mega_slot1(QWidget *editor)
{
    QLineEdit *edit = qobject_cast<QLineEdit*>(editor);
    qDebug() << "key" << edit->property("key").toString() << "value" << edit->text();
}

В MyDelegate в методе createEditor добавляю такие строки
Код:
QLineEdit *editor = new QLineEdit(parent);
editor->setProperty("key", 400);
return editor;
« Последнее редактирование: Апрель 02, 2013, 13:49 от vintik » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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