LINUX.ORG.RU

[qt] тупо отследить изменение дочерних виджетов

 


0

0

Есть у нас QWidget, ну или QDialog, это не важно. Так вот, как отследить изменение в его дочернем виджете? Я хочу, чтобы при изменении в любом из них(например, пользователь передвинул слайдер или выбрал значение в комбе) это сигнализировалось его родителем. МОжно конечно делать обвязку индивидуально, но не хочется. спасибо.


Ответ на: комментарий от k0l0b0k

Мне нужно знать, когда там что-то изменяется. Если ты такой умный, то твой ответ меня не устроил.

ShTH
() автор топика

Делать обвязку индивидуально. Я уже делал так, вопрос видимо связан с созданием диалога настройки чего-то. В KDE например кнопка Apply становится активной только если ты что-то изменил, но там все элементы диалога добавляются не стандартно, а через специальне API. В Qt я нужно

1) написать универсальный алгоритм, который рекурсивно обходит диалог и делает connect()-ы на каждый элемент индивидуально.

2) написать функцию, которая принимает QObjectList и делает connect()-ы на каждый элемент из этого списка. В этом случае тебе надо будет явно вызывать эту функцию и передавать все интересующие виджеты.

Все коннекты идут на один слот типа

void A::slotChanged()
{
    m_dirty = true;
    ...
}

Первый способ довольно плохой, т.к. в некоторых виджетах есть свои внутренние виджеты, изменение состояния которых ты тоже будешь ловить, хотя не должен. Можно создать игнорлист, типа если объект - QSpinBox, то вглубь него уже не идём.

Я предпочёл второй.

alex_custov ★★★★★
()

В родителе создаёшь слот somethingChanged(), и присоединяешь к нему соотв. сигнал каждого нового дочернего виджета. Если виджеты нестандартные, то это удобно делать прямо из их конструкторов. В KDE таким образом сделаны диалоги настроек.

summatus
()
Ответ на: комментарий от alex_custov

автор спрашивает как ему лучше написать Observer, ему отвечают «Observer» :D

ну, механизм сигналов/слотов половину реализации ему уже даёт - осталось понять, как его прикрутить

jtootf ★★★★★
()
Ответ на: комментарий от ShTH

Блин, конечно готово.
installEventFilter называется.

zJes ★★
()
Ответ на: комментарий от ShTH

Видимо этого нет потому что понятие «изменение» для сферического виджета в вакууме не вполне однозначно.

KblCb ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.