Создайте макет сетки динамически и управляйте им в Qt

Я новичок в Qt, и в настоящее время у меня есть некоторые проблемы. Я хочу создать макет сетки в Qt из кода С++ и иметь возможность управлять им оттуда. Я пробовал много разных вещей, но ни одна из них не работает.

По сути, я хочу иметь окно с кнопкой в ​​нем (сделано это), и при нажатии кнопки окно должно превратиться в сетку кнопок без фиксированного количества строк или столбцов. (надеюсь, я ясно понял, что я хочу сделать)

На данный момент я создал два файла .qml , один файл qml содержит код для первого окна (тот, что с одной-единственной кнопкой), а другой файл qml имеет макет сетки, в котором ничего нет. Есть также два файла С++, первый из которых - main.cpp, а второй - код, который я пишу, чтобы «заполнить» сетку одним нажатием кнопки.

Опять же, я новичок в Qt, поэтому, если у вас есть идеи получше, дайте мне знать!


person John    schedule 27.05.2017    source источник
comment
Было бы здорово, если бы вы добавили немного кода вместо описания того, что вы сделали. В любом случае, какой смысл создавать и управлять QML-объектом из C++? Это довольно просто сделать только с QM.   -  person folibis    schedule 28.05.2017
comment
@folibis А как мне создать сетку с неизвестным количеством измерений и несколькими кнопками в каждой ячейке?   -  person John    schedule 28.05.2017
comment
Вы должны уточнить этот момент. Что значит - неизвестное количество измерений?   -  person folibis    schedule 28.05.2017
comment
@folibis Я имею в виду, что числовые размеры будут генерироваться случайным образом каждый раз при создании этого окна, а это означает, что количество кнопок также не является статичным (размер X * размер Y). По сути, я хочу многократно создавать кнопки в файле qml. Извините за беспокойство!   -  person John    schedule 28.05.2017
comment
Вы используете Repeater { model: Math.round(Math.random() * 2147483647); delegate: Button {} }   -  person derM    schedule 29.05.2017
comment
Ого... @derM осторожнее с такими примерами -)   -  person folibis    schedule 29.05.2017
comment
@derM Повторитель - это то, что я в конечном итоге использовал, однако кажется, что я не могу решить проблемы с привязкой переменных, когда я устанавливаю положение каждой кнопки (я использую счетчики для координат x и y. Кажется, что в конце концов ВСЕ кнопки оказываются в одной ячейке)   -  person John    schedule 31.05.2017
comment
Вы не можете использовать координаты x и y, когда хотите использовать сетку   -  person derM    schedule 31.05.2017


Ответы (1)


Вы можете использовать Repeater для создания некоторого количества Button в качестве дочерних элементов Grid. Grid автоматически установит позиции Button, поэтому вам не нужно устанавливать anchors или координаты.

Для обработки сигналов вы определяете где-то один сигнал, который затем подключаете к сигналу кнопок.

Grid {
    id: buttonGrid
    signal buttonClicked(int index)
    Repeater {
        model: 100 // or any integer number
        delegate: Button {
            onClicked: buttonGrid.buttonClicked(index)
        }
    }
}

Вместо использования целочисленной модели вы также можете использовать, например, ListModel или любой QAbstractItemModel-потомок. Затем вы также можете использовать их роли, чтобы получать такие вещи, как тексты, цвета или функции...

Также возможен простой массив с текстами.

person derM    schedule 31.05.2017
comment
Сигнал был то, что мне нужно! Спасибо! - person John; 31.05.2017