Форум программистов, компьютерный форум, киберфорум
QML
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 17.03.2016
Сообщений: 28
1

QML Как принять сигналы от динамически создаваемых объектов

12.01.2017, 02:15. Показов 2924. Ответов 5

Author24 — интернет-сервис помощи студентам
Здравствуйте. Как можно установить слоты для сигналов динамически создаваемых QML объектов?

Поясню на примере:

Есть, например, Popup с кнопками, при нажатии на которые должен выбираться цвет в основном окне.
Код popup'a:
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
Popup{
    id: selectColorPopup
 
    signal colorSelected(string color) //Сигнал, который нужно поймать
 
    x: (parent.width - width) / 2
    y: (parent.height - height) / 2
    modal: true
    focus: true
    contentHeight: ((popupContent.implicitHeight % 2) == 1) ? popupContent.implicitHeight + 1 : popupContent.implicitHeight
    width: mainWindow.isTablet ? (parent.width / 3 * 2) : (parent.width / 9 * 7)
    closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside
    padding: 0
    onClosed: selectColorPopup.destroy()
 
    ColumnLayout{
        id: popupContent
        width: selectColorPopup.width
        spacing: 0
 
        Label{
            text: "Выберите цвет"
            wrapMode: Text.WordWrap
            font{pixelSize: 20; weight: Font.DemiBold;}
            Layout.fillWidth: true
            Layout.topMargin: 24
            Layout.leftMargin: 24
            Layout.rightMargin: 24
            Layout.bottomMargin: 20
            Layout.row: 0
            Layout.column: 0
            Layout.columnSpan: 5
        }
        GridLayout{
            width: parent.width
            Layout.leftMargin: 24
            Layout.bottomMargin: 28
            Layout.fillWidth: true
            columns: 5
            Repeater{
                model: servoColorsModel
                delegate: Button{
                    id: colorButton
                    background: Rectangle{
                        implicitWidth: 56
                        implicitHeight: implicitWidth
                        radius: implicitWidth / 2
                        opacity: 1.0
                        border.width: 1
                        border.color: "#616161"
                        color: modelData
                    }
                    onClicked: {
                        colorSelected(modelData)
                        selectColorPopup.close();
                    }
                }
            }
        }
    }
}
Вот так этот Popup создается в нужном месте:
Javascript
1
2
3
4
5
6
7
8
//Кнопка, при нажатии на которую создается попап
Button{
    //Много настроек кнопки
    onClicked: { var SelectColorPopupComponent = Qt.createComponent("./common/SelectColorPopup.qml")
                var selectColorPopup = SelectColorPopupComponent.createObject(servoSettingPage)
                selectColorPopup.open()
    }
}
Как дальше поступить, чтобы принять данные с Popup'a?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.01.2017, 02:15
Ответы с готовыми решениями:

Описание динамически создаваемых объектов
Доброго времени суток. Проблема: в ходе выполнения программы создаются изображения с определенным...

Сохранение в INI Динамически создаваемых объектов
Привет всем. Решил попробовать создавать элементы динамически, до этого никогда с этим не...

Сериализация динамически создаваемых объектов с последующей десериализацией
Господа! Помогите мне придумать как сохранить динамически создаваемые объекты на форме. Как я...

Как передать значения динамически создаваемых компонентов процедуре
Есть pagecontroll на нем есть кнопка которая создает новую вкладку: procedure...

5
1070 / 652 / 229
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
12.01.2017, 09:32 2
Лучший ответ Сообщение было отмечено Mixxxxa как решение

Решение

Mixxxxa, можешь посмотреть на пример создания динамического объекта у меня в блоге.
Или обратиться к документации.
1
0 / 0 / 0
Регистрация: 17.03.2016
Сообщений: 28
12.01.2017, 17:59  [ТС] 3
Цитата Сообщение от Wyn Посмотреть сообщение
пример создания динамического объекта у меня в блоге.
В принципе получилось, но не совсем так, как описано... Пришлось сделать отдельную функцию под слот.

Метод onClicked некой кнопки:
Javascript
1
2
3
4
5
6
7
onClicked: {
    var SelectColorPopupComponent = Qt.createComponent("./common/SelectColorPopup.qml")
    var selectColorPopup = SelectColorPopupComponent.createObject(servoSettingPage)
    selectColorPopup.colorSelected.connect(servoSettingPage.setNewColor) //Работает, но требует отдельной функции
    //selectColorPopup.colorSelected.connect(setColor(){ servoSettingsColor.selectedColor = newColor; }) //Сделано по примеру в блоге, но не работает. 
    selectColorPopup.open()
}
Может я что-то напутал и все-таки можно вписать функции прямо при создании?

Не по теме:

Кстати, отличные статьи. Хотелось бы увидеть продолжение про особенности работы с различными OC

0
1070 / 652 / 229
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
12.01.2017, 19:55 4
Лучший ответ Сообщение было отмечено Mixxxxa как решение

Решение

Цитата Сообщение от Mixxxxa Посмотреть сообщение
Может я что-то напутал и все-таки можно вписать функции прямо при создании?
Не может, а точно.
1) Там должна быть неименованная функция(форум у меня в примере даже подчёркивает слово function, прямо указывая, что это ключевое слово языка, а не просто имя), а у вас вместо ключевого слова function идёт имя функции(в виде setColor).
2) Что за newColor у вас там? Если он передаётся в качестве параметра функции(через сигнал colorSelected), то его надо в функции же и прописывать в качестве аргумента.

В итоге попробуйте как-то так записать:
Javascript
1
selectColorPopup.colorSelected.connect(function(newColor) { servoSettingsColor.selectedColor = newColor; });
P.S. Продолжение обязательно будет как руки дойдут. Но до этого нужно порядок навести в прикреплённых темах в разделе, обновить их и почистить. Пока этого не сделаю за переписывание старых статей блога не возьмусь.
1
0 / 0 / 0
Регистрация: 17.03.2016
Сообщений: 28
12.01.2017, 23:25  [ТС] 5
Цитата Сообщение от Wyn Посмотреть сообщение
попробуйте как-то так записать:
Да. Теперь отлично работает. Спасибо

Цитата Сообщение от Wyn Посмотреть сообщение
форум у меня в примере даже подчёркивает слово function, прямо указывая, что это ключевое слово языка, а не просто имя
Каюсь, не обратил внимания.

Не по теме:

Цитата Сообщение от Wyn Посмотреть сообщение
Продолжение обязательно будет как руки дойдут
Будем ждать :)



Добавлено через 2 часа 47 минут
Пока переделывал функции появился еще один вопрос более-менее по теме:

Компоненты для динамических объектов лучше создавать при открытии родительской формы или уже во время создания объектов?
0
1070 / 652 / 229
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
13.01.2017, 00:28 6
Цитата Сообщение от Mixxxxa Посмотреть сообщение
Компоненты для динамических объектов лучше создавать при открытии родительской формы или уже во время создания объектов?
Обычно компоненты создаются во время создания объектов. В противном случае смысл создавать их динамически? Ведь динамически объекты создаются не просто так, а ради того чтобы сэкономить время/ресурсы при создании объекта, в котором они создаются. Вдруг они не понадобятся, так зачем создавать преждевременно?
0
13.01.2017, 00:28
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.01.2017, 00:28
Помогаю со студенческими работами здесь

Как открыть txt в динамически создаваемых textbox (сторонняя библиотека)
Делаю подобие текстового редактора с компилятором, создаются textbox от сторонней библиотеки...

Как уменьшить количество создаваемых объектов в при написании меню программы
Я пишу меню к программе работающей по следующим условия: сделать приложение для сортировки массивов...

Считывание динамически создаваемых строк
Дано неопределённое количество строк (формат : строка и число). Их конец определяется временем...

Позиционирование динамически создаваемых GroupBox
У меня програмно создается гроуп бокс. Но их создается несколько. Вот такой вот функцией. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru