Connect из QVector<QPushButton*>

229
09 апреля 2017, 03:56

Здравствуйте! Пишу игру и столкнулся с одной проблемой. У меня есть 25 кнопок QPushButton в Ui. Я их поместил в вектор QVector<QPushButton*> buttons. (buttons.push_back(ui->b1);). Когда решил сделать для них connect, то решил сделать это через for(), потом через foreach(). Делаю так:

connect(buttons[i], &QPushButton::pressed, this, [&]() {
    doIt(buttons[i]);
});

Приложение запускается, всё работает. Но если нажать на любую кнопку, то вызывается:

ASSERT failure in QVector operator[]: index is out of range

В функции doIt(QPushButton *but) ошибку вызывает but->text().toInt();

А вот если соеденять по очереди из формы, то всё работает:

connect(ui->b1, &QPushButton::pressed, this, [&]() {
    doIt(ui->b1);
});
...
connect (ui->b25, &QPushButton::pressed, this, [&]() {
    doIt(ui->b25);
});
Answer 1

Скорее всего, вы создаете массив buttons[i] в том же методе, что и производите подключение и массив разрушается при выходе из области видимости. При срабатывание события нажатия на кнопку, выполняет:

 doIt(buttons[i]);

Обращение к массиву, который уже разрушен.

Можете попробовать изменить способ захвата переменных, чтоб они передавались по значению:

connect(buttons[i], &QPushButton::pressed, this, [=]() {
    doIt(buttons[i]);
});
Answer 2

Очевидный выход индекса за границы вектора в цикле. Покажите код или юзайте foreach.

READ ALSO
Как удалить нужную часть текста из текстового документа?

Как удалить нужную часть текста из текстового документа?

Допустим, я записал некоторую структуру в текстовый файл с помощью fwrite, например, 20 заводовКак я могу удалить нужные мне заводы? Можно ли стереть...

390
Виртуальное наследование

Виртуальное наследование

VS2015Код упростил

242
Шаблонный класс [дубликат]

Шаблонный класс [дубликат]

На данный вопрос уже ответили:

263
Почему программа выдает ошибку на Q_OBJECT в классе, наследованный от QMainWindow?

Почему программа выдает ошибку на Q_OBJECT в классе, наследованный от QMainWindow?

Всем здравствуйтеЯ недавно начал учить фреймворк Qt

252