2013-05-28 6 views
2

У меня есть класс/QDialog (назовем его «Frame»), который содержит другие классы. Это то, что он выглядит следующим образом:Доступ к методам из другого класса внутри QWidget

Frame Class

В приведенном выше скриншоте, все внутри зеленого прямоугольника фактически отдельный класс/пользовательские QWidget (назовем его «Page3», поскольку он является третьим пунктом в списке), помещенный внутри QStackedWidget, в то время как все, что находится за пределами прямоугольника, является частью Frame. Таким образом, все внутри прямоугольника отделено от рамки, хотя оно, как представляется, является частью одной и той же формы. Нажатие на Обзор и Объекты SQLite вызывает загрузку отдельной страницы внутри QStackedWidget. Все эти классы должны иметь возможность общаться друг с другом.

Проблема в том, что я не уверен, как получить доступ к общедоступным методам или переменным Frame изнутри. См., Одна из функций Page3 заключается в том, чтобы разблокировать кнопку ОК в кадре, когда содержимое двух полей пароля (Пароль & Повторите). Для этого нужно вызвать метод, который разблокирует кнопки в кадре. Мне нужно связаться с текущим экземпляром Frame вместо создания новой копии, поэтому создание экземпляра Frame изнутри Page3 не работает. Я не могу использовать parent() либо потому, что просто ссылается на QStackedWidget внутри Frame вместо самого кадра.

Буду признателен, если кто-нибудь скажет мне, как это сделать.

ответ

2

Я предпочитаю делать такие вещи (связь между дочерним виджемом и его родителем) с использованием сигналов и слотов. Зачем? Поскольку, если дочерний элемент явно зависит от родителя, вы получаете круговую зависимость, и в будущем вы можете изменить свой дизайн.

Простейшее решение состоит в том, чтобы Page3 излучал сигнал «unlockOk», который подключен к слоту в кадре, который выполняет фактическую «разблокировку» кнопки. Кадр может подключать сигнал и слот в своем конструкторе, или где бы то ни было, это фактически создает экземпляр объекта Page3.

Если вы хотите сделать еще один шаг, вы можете сделать сигналы более универсальными; например, сигналы, называемые «inputValid» (которые будут выбрасываться при совпадении полей пароля) и «inputInvalid», которые будут подключены к слотам «unlockOk» и «lockOk». Причина этого заключается в том, что вы можете повторно использовать сигналы в других частях вашего приложения, если вам нужно, и их имена четко указывают, что они сообщают.

+0

Звучит так, как будто это может сработать. Есть ли способ отправить сигналы между классами? Я спрашиваю, потому что мне никогда не приходилось это делать раньше. –

+0

Взгляните на документацию Qt: http://qt-project.org/doc/qt-4.8/signalsandslots.html Вы объявляете сигнал в разделе «сигналы» вашего объявления класса, а слот в «слотах» " раздел; затем определите метод слота, как и обычный метод класса. Затем вы подключите их где-нибудь, используя метод 'QObject :: connect', например:' connect (page3, SIGNAL (inputValid()), это, SLOT (unlockOk())); ' –

+0

Ваше решение отлично работает. Благодаря! –