Сигналы для событий входа/выхода в TabView

У меня есть TabView, в котором есть 3 Tab, скажем, tab1, tab2, tab3. Каждый Tab имеет несколько виджетов. Я хочу иметь какой-то сигнальный механизм, чтобы, когда я вхожу в tab3, я хотел установить состояние некоторых виджетов (например, TextField) в tab3, а когда я выхожу из него, я хочу сбросить их состояние.

Любые указатели на то, как этого добиться? Когда я читал документацию Qt 5.3 о TabView и Tab, я не нашел никаких сигналов, выставленных ими.

Сигнализация может находиться в пределах tab3 или между Tabview и tab3. Я в порядке с любым из них.


person Sandeep    schedule 10.12.2014    source источник


Ответы (2)


Используйте onVisibleChanged Попробуйте это:

TabView {

    Tab {
        onVisibleChanged: console.log("hello1 "+visible)
        title: "Red"
        Rectangle { color: "red" }
    }
    Tab {
        onVisibleChanged: console.log("hello2 "+visible)
        title: "Blue"
        Rectangle { color: "blue" }
    }
    Tab {
        onVisibleChanged: console.log("hello3 "+visible)
        title: "Green"
        Rectangle { color: "green" }
    }
}
person Kosovan    schedule 10.12.2014
comment
Я собирался сам ответить на свой вопрос, но вы поторопились. onVisibleChanged, onFocusChanged работали у меня. Мой qtcreator автоматически давал мне подсказки в тот момент, когда я начинал печатать (ключевое слово). Но я не вижу их как часть документации qt5.3 в Tab. - person Sandeep; 10.12.2014
comment
@Sandeep Поскольку Tab наследует это свойство: qt- project.org/doc/qt-5/qml-qtquick-item.html#visible-prop Таким образом, вы можете использовать его, но в документе нет явного описания, вместо этого вы можете использовать это: qt-project.org/doc/qt-5/qml- qtquick-controls-tab-members.html - person Kosovan; 10.12.2014

При смене вкладки меняется видимость ДВУХ вкладок: на вкладке выхода (с false на true) и на вкладке входа (с true на false). Эти события не всегда сериализуются. Я должен был добавить:

onVisibleChanged: {
    if (!this.activeFocus){
        // ...
    }
}

Но если вы на самом деле не нажимаете на вкладку, а активируете ее, устанавливая для вкладки active значение true, приведенного выше решения недостаточно. Вам нужно будет использовать TabView.currentIndex, чтобы сравнить его со статическим, то есть декларативным индексом вкладок. Если для новой активной вкладки вызывается onVisibleChanged, то индексы должны быть равны.

Вот как пример:

function refreshButtons(tabIndexStatic){
    if (tabStepsView.currentIndex !== tabIndexStatic)
        return;
    buttonPrev.visible      = tabIndexStatic !== 0
    buttonNext.visible      = tabIndexStatic !== tabStepsView.count - 1
    buttonConvert.visible   = tabIndexStatic === tabStepsView.count - 1
    }
    Tab {
        title: qsTr("Tab 0")
        onVisibleChanged: parent.refreshButtons(0)

        // ...
    }
    Tab {
        title: qsTr("Tab 1")
        onVisibleChanged: parent.refreshButtons(1);
        // ...
    }
    Tab {
        title: "Tab 2"
        onVisibleChanged: tabStepsView.refreshButtons(2)
        // ...
    }
}
person Nicolas    schedule 24.09.2015