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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Доступ до дочерних элементов  (Прочитано 6995 раз)
juvf
Программист
*****
Offline Offline

Сообщений: 564


Просмотр профиля
« : Январь 16, 2023, 10:02 »

Как поменять свойства дочерних элементов?

есть свой элемент MyButton.qml

Код:
Rectangle{
    id: myButton
    width: 93
    height: 93
    color: "transparent"

    Button{
        id: butPage
        anchors.fill: parent
        onClicked: {
            updateFocusAudio(myButton);
            }

        Text {
            id: temeratureText
            text:  "12"
        }
}

допустим я добавляю куда-нибудь эту свою кнопку и хочу поменять текст и/или колбэк по нажатию. как это сделать? Попробовал так


Цитировать
Item:{
     id: mainForm
     MyButton{
           butPage.onClicked: updateFocusAudio(myButton)
           temeratureText.text: "13"
     }
}
ошибка компиляции. butPage и temeratureText - invalid property name. как это правильно сделать?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #1 : Январь 16, 2023, 10:17 »

надо добавить нужные property [alias] в свой элемент, это подробно описано в документации
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
juvf
Программист
*****
Offline Offline

Сообщений: 564


Просмотр профиля
« Ответ #2 : Январь 16, 2023, 11:20 »

1) текст можно через property поменять. А как поменять вызываемую функцию через property? Какой должен быть тип?
2) я для упрощения сделал маленький myButton. На самом деле в нем много всяких вложенных объектов, в которые вложены другие... мне не очень нравиться выносить всё, что требуется менять, выносить 100500 property. Есть способ добраться до дочерних элементов без property ?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #3 : Январь 17, 2023, 12:55 »

1) тип var наверное
2) добраться напрямую нельзя — только через новые свойства (обычные или алиас) или функции
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
juvf
Программист
*****
Offline Offline

Сообщений: 564


Просмотр профиля
« Ответ #4 : Январь 18, 2023, 07:14 »

Хорошо..... вот сделал свою кнопку. Со свистелками... рюшечки обои... тени/подсветка/эффекты.... обрамил её ректом

Код:
Rectangle{
    id: myButton
    property bool activePage: false
    property string textButton: ""
    property string imageSource: ""

    Button{
        id: but
        anchors.fill: parent
        highlighted: activePage
        clip: true
        onClicked: {
            callback(); //как вынести этот callback в свойства
            // Запускаем анимацию
            colorRect.x = pressX
            colorRect.y = pressY
            circleAnimation.start()
            colorAnim.start()
            }
      }
}

получился довольно тяжелый корневой Rectangle, поэтому вынес его в отдельный *.qml фаил. Там, где надо использовать - объявляю экземпляр кнопки и задаю ей через свойства картинку, текст, цвет....
но в разных местах в разных экземплярах этой кнопки мне нужно при нажатии разные действия на нажатие. Как теперь экземплярам этой кнопки указывать разные callback-и?
Записан
juvf
Программист
*****
Offline Offline

Сообщений: 564


Просмотр профиля
« Ответ #5 : Январь 18, 2023, 07:16 »

надо добавить нужные property [alias] в свой элемент, это подробно описано в документации
где подробно описано в документации как вынести callback в property?  Можете в моем коде добавить этот проперти? какой синтаксис?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #6 : Январь 18, 2023, 12:43 »

вот простейший пример:

Код:
Window {
width: 640
height: 480
visible: true
title: qsTr("Hello World")

B {
callback: () => console.log("hello")
}

component B: Item {
property var callback

Button {
onClicked: callback()
text: "test"
}
}
}

кстати activePage у тебя можно сделать просто как алиас на but.highlighted
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
juvf
Программист
*****
Offline Offline

Сообщений: 564


Просмотр профиля
« Ответ #7 : Январь 18, 2023, 13:01 »

вот простейший пример:

Да, с холовордом заработало. спасибо. Я же говорю, с синтаксисом не понятно. А как это сделать с функцией, в которую передаются аргументы?

кстати activePage у тебя можно сделать просто как алиас на but.highlighted
так я его вынес в проперти, т.к. нужно его менять but.highlighted снаружи, т.е. снаружи нужно получить доступ до дочерних эл-ов.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #8 : Январь 18, 2023, 13:48 »

не знаю что там непонятно. переменная типа var (любой жс объект), присваиваем ей жс функцию. почитай как в жс пишутся функции. в кумл с жс придется сталкиваться нередко, поэтому желательно основы языка все-таки изучить.

так я и говорю, что можно сделать property alias, чтоб устранить ненужное отдельное свойство, чья задача лишь передать значение дочернему элементу. https://doc.qt.io/qt-6/qtqml-syntax-objectattributes.html#property-aliases
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
juvf
Программист
*****
Offline Offline

Сообщений: 564


Просмотр профиля
« Ответ #9 : Январь 18, 2023, 14:10 »

не знаю что там непонятно.

не понятно вот это - вот функция js в qml

    function updateFocus(obj)
    {
        butPage1.activePage = false;
        switch(obj)
        {
    ...
        }
    }

теперь я её вызываю по нажатию кнопки
      Button {
                        id: asd
         onClicked: updateFocus(asd)
         text: "test"
      }

Тут всё понятно. Теперь я захотел по onClicked вызвать функцию через проперти.

я сделал так
Item {
          property var nameMacros: updateFocus
      Button {
                        id: asd
         onClicked: nameMacros(asd)
         text: "test"
      }
} - не заработало. Я делал так

Item {
          property var nameMacros: updateFocus(obj)
      Button {
                        id: asd
         onClicked: nameMacros(asd)
         text: "test"
      }
} - не заработало

вот так делаются проперти в qml:
property int name: 123
акказываицо с функциями другой синтаксис
property var name - т.е. ключевое слово property, затем тип var, затем имя свойства. двоеточия не нужно. Где-то есть в мануалах/примерах как в качестве проперти делать функцию?
Далее....

смотрю Ваш пример

callback: () => console.log("hello") - НИФИГАСЕБЕ как надо было!!! Т.е. имя проперти, двоеточие, скобочки, симовл => и затем команду!!! И в теле кнопки вызывать не "callback", а "callback()".

Вообще всё не понятно. Как в js или/и в qml сделать указатель на функцию без аргументов? Как сделать указатель на функцию с аргументами? как вызывать функцию через указатель? Как сделать указатель на функцию с аргументами, которая возвращает значение?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #10 : Январь 18, 2023, 15:31 »

> двоеточия не нужно
оно опционально, как и в случае с другими свойствами. можно, например, задать начальное значение null.

> Где-то есть в мануалах/примерах как в качестве проперти делать функцию?
в документации вроде не попадалось, я пользовался здравым смыслом при написании примера

> НИФИГАСЕБЕ как надо было!!!
ну, понятно, что если ты никогда не видел как пишутся жс функции, ты б не догадался Улыбающийся есть и другая форма записи — через ключевое слово function.

> И в теле кнопки вызывать не "callback", а "callback()"
а вызов функции как-то по-другому делается в С-подобных языках? Улыбающийся посмотри, например, на лямбды в С++.

> Как в js или/и в qml сделать указатель на функцию...
как без аргументов и как вызывать я уже показал. аргументы пишутся внутри () просто именами, типы необязательно указывать (не помню в какой версии Qt ввели возможность писать типы). тип возвращаемого значения можно не указывать, просто пишешь return ... в нужных местах. если функция состоит из более, чем одного выражения, надо использовать фигурные скобки: => { ... }

в общем, плотненько почитай QML документацию, особенно по части взаимодействия с жс, а также ознакомься с основами жс.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
juvf
Программист
*****
Offline Offline

Сообщений: 564


Просмотр профиля
« Ответ #11 : Январь 19, 2023, 07:07 »

в общем, плотненько почитай QML документацию, особенно по части взаимодействия с жс, а также ознакомься с основами жс.
Да вы что!? Реально, если почитать документацию - то вопросов не будет? Ooooo .... оказывается  есть документация по QML! СПАСИБО ЗА ПОДСКАЗКУ.

это совет из серии - "сам разбирайся, я тебе не буду помогать".

меня умиляют такие советы. зачем их дают? Вы думаете я не читал документацию по QML и по js? Если бы после прочтения документации ни у кого ни когда не возникало вопросов, то тогда и этот форум не нужен. На любой вопрос по любому языку можно ответить "почитай C++/C/QML/QtC/.... документацию".

если кто-то напишит код на СИ с обращением к функции через указатель, ошибется, выложит этот кусок и спросит - "сделал так, не работает. как нужно?", то я поправлю его код без отсылки к RM.

Вы знаете что я делаю не так? Вам поправить мой код - это 1-2 сточки. ВСЁ!!! Зачем столько много слов/постов писать и отсылать к документации?


Цитировать
> Как в js или/и в qml сделать указатель на функцию...
как без аргументов и как вызывать я уже показал.
Я не увидел.


может вот это? callback: () => console.log("hello"), но я не увидел, что вы здесь объявили указатель на функцию. потому-что нет ни каких комментариев и пояснений. У меня функция - несколько комнад. Тут за callback одна команда, нет тела функции. Что это? может что-то типа аля макрос в си?

Цитировать
есть и другая форма записи — через ключевое слово function
я через function определяю все функции в qml. ничего общего с вашим "callback: ()" я не увидел.

ps... по поводу "я уже показал"... что вы показали? вот это
Код:
Window {
width: 640
height: 480
visible: true
title: qsTr("Hello World")

B {
callback: () => console.log("hello")
}

component B: Item {
property var callback

Button {
onClicked: callback()
text: "test"
}
}
}
Что это такое? например вот это
Цитировать
   B {
      callback: () => console.log("hello")
   }
что такое B? (вопрос риторический) объявление нового компонента? Я не гуру в qml, часто обращаюсь к мануалам, часто изучаю чужой код, чужие примеры, смотрю/читаю уроки... я не разу не видел такой записи.

Далее... вот эта сточка
Код:
component B: Item {
Что такое Item - я знаю. Но что такое component - нет. Гугл асистент в помощь. Открываю QtC->асистент, вбиваю "component", он находит в qml ТОЛЬКО в SceneLoader метод component. Но в приведённом вашем коде нет ни каких SceneLoader. Так что эта строчка обозначает? (это тоже вопрос риторический).


Я это всё к тому, что я qml и js изучаю в бою. по большому мне они не нужны, т.е. я не собираюсь быть профессиональным программистом в qml или js. Мне они нужны по стольку по скольку. мне бы через указатель вызвать функцию по нажатию кнопки и все, и поехал дальше... задач основных - завал. Да... со временем, если буду часто в qml конечно руку набью... но сейчас разбираться что такое "component B"Непонимающий

pps за алиасы ещё раз спасибо. рука набивается.


« Последнее редактирование: Январь 19, 2023, 08:58 от juvf » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #12 : Январь 19, 2023, 12:32 »

> СПАСИБО ЗА ПОДСКАЗКУ.
ну вот алиасы в документации вполне описаны, как и то, что начальное значение для свойства необязательно, а ты о них не знал, что как бы намекает Улыбающийся

> Вы знаете что я делаю не так? Вам поправить мой код - это 1-2 сточки. ВСЁ!!! Зачем столько много слов/постов писать и отсылать к документации?
подход «сделайте за меня» еще никого ничему толком не научил

> Я не увидел.
я уже несколько раз написал: изучай жс, почитай как там определять анонимные функции (кажется я слово «анонимные» забыл до этого сказать) / замыкания / лямбды. в моем примере как раз используется анонимная функция без аргументов. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions

почему ты сразу не сказал, что половина моего примера непонятна, а о жс ты не знаешь примерно ничего? вместо этого начинаешь брызгать слюной, ай-яй-яй, заставляют читать документацию.

ключевое слово component было добавлено в 5.15 кажется, позволяет описывать новые компоненты в текущем файле, без необходимости выносить их в отдельный.
Код:
component B: Item { ... }
эквивалентно
Код:
// B.qml
Item { ... }

> Я это всё к тому, что я qml и js изучаю в бою. по большому мне они не нужны, т.е. я не собираюсь быть профессиональным программистом в qml или js
так я тоже, вот только документацию QML очень плотно читал, чтобы понять что там вообще есть, какие подходы можно использовать и т.д. чтоб делать по-человечески. для хеллоуворлд всю читать, конечно, не надо Улыбающийся
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
juvf
Программист
*****
Offline Offline

Сообщений: 564


Просмотр профиля
« Ответ #13 : Январь 19, 2023, 13:45 »

что как бы намекает Улыбающийся
немекает на что? что я плохо знаю qml? Я прямо говорю - я плохо знаю qml, и что? Я не могу обратиться сюда за помощью?

Цитировать
подход «сделайте за меня» еще никого ничему толком не научил
не путайте подход «сделайте за меня» с подходом «покажите как правильно». Я вам не ставил задачу и чтоб вы за меня её сделали. я показал как я попытался решить эту задачу и спросил - что я сделал не так? Поправьте, покажите как нужно? Показать на примере как нужно сделать - это практической обучение, которое обучает не хуже теории. 

вместо того, чтобы в моём коде исправить 1-2 строчки - вы написали свой код, в 16 строк (не лень же было). т.е. один раз ударить топором по моему qt5.12 бревну - это для вас "я за вас делать не буду", а построить рядом свой дом из qt5.15 кирпича как пример - вам на это не жалко вермени.

Цитировать
начальное значение для свойства необязательно, а ты о них не знал,
да.... не знал... повешаться теперь?.... рассказать вам как проходит самообучение языку программирования? Правильно, по самоучителю. А если его нет, то по урокам, примерам.... Нужно было отрисовать в qml - открыл уроки... ага - есть Item, есть Text, есть синтаксис... всё понятно. В уроке показали как задавать проперти
property int name: 123   - выучил.

Открываю асистент - вбиваю туда "property" - нет там этих property не находит ассистант эти ваши дикпики проперти.

Цитировать
почему ты сразу не сказал, что половина моего примера непонятна, а о жс ты не знаешь примерно ничего? вместо этого начинаешь брызгать слюной, ай-яй-яй, заставляют читать документацию.
не знаю. а что бы поменялось? вы бы не стали меня заставлять читать доки и без комментариев поправили бы мой код?

Цитировать
ключевое слово component было добавлено в 5.15
у меня 5.12.

Цитировать
так я тоже, вот только документацию QML очень плотно читал, чтобы понять что там вообще есть, какие подходы можно использовать и т.д. чтоб делать по-человечески. для хеллоуворлд всю читать, конечно, не надо
я не хочу быть проф. прогарммистом qml и божеупаси js. жысть заставила заглянуть в qml...

будьте толлерантны к тем, кто обращается за помощью.


ps
Цитировать
в моем примере как раз используется анонимная функция без аргументов. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions
oooooo.... вот скажите... вот человек, идет мимо js. Ему это js - как 5-ая нога собаке. Выучил ключевое слово function - это необходимо и достаточно для решения текущей задачи. Больше от js мне ни чего не нужно. открываю вашу ссылку и там на! на! на! по голове и вижу - в это всё надо погружаться, во всё вникать .... это надо учить и чтобы не забыть - практиковаться. Но мне это не нужно. У меня совершенно другие задачи.
Записан
juvf
Программист
*****
Offline Offline

Сообщений: 564


Просмотр профиля
« Ответ #14 : Январь 19, 2023, 13:59 »

Цитировать
плотненько почитай QML документацию, особенно по части взаимодействия с жс
vs
Цитировать
в документации вроде не попадалось

Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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