Как изменить данные QGraphicsProxyWidget?
Я создал QGraphicsProxyWidget на QGraphicsScene. И хочу чтобы по нажатию она меняла картинку(иконку).
NewScene::NewScene(QObject *parent) : QGraphicsScene(parent)
{
//добавляем кнопку
QPushButton* btn = new QPushButton("Запуск");
QGraphicsProxyWidget* wgt = this->addWidget(btn);
btn->setIcon(QIcon(":/new/prefix1/Items/knife-switch-off.png")); //добавляем картинку
btn->setIconSize(QSize(65, 65));
wgt->setX(-200);
wgt->setY(0);
//событие кнопки
QObject::connect(btn, &QPushButton::clicked, [ = ]() {this->QCalcColission();});
}
void NewScene::QCalcColission()
{
// меняем иконку кнопки
this->btn->setIcon(QIcon(":/new/prefix1/Items/knife-switch-on.png"));
}
Вот тут при нажатии происходит ошибка - программа вылетает:
Программа неожиданно завершилась.
Если не писать this->btn->setIcon(QIcon(":/new/prefix1/Items/knife-switch-on.png"));, а сделать, например, всплывающее окно, то ошибки нет.
Так что загвоздка именно в том, что я неправильно обновляю виджет.
Возможно нужен какой-то метод который его обновит , но какой? Или это вообще иначе делается?
Ответы (1 шт):
Потому что указатель btn "виден" только в локальной область видимости конструктора. Чтобы кнопка была доступна в любом методе класса надо сделать ее полем класса:
class NewScene : public QGraphicsScene {
private:
QPushButton* btn;
}
Теперь создаем кнопку в конструкторе:
NewScene::NewScene(QObject *parent) : QGraphicsScene(parent)
{
//добавляем кнопку
btn = new QPushButton("Запуск");
...
}
Далее, в любом методе класса, в частности:
void NewScene::QCalcColission()
{
// меняем иконку кнопки
this->btn->setIcon(QIcon(":/new/prefix1/Items/knife-switch-on.png"));
}
Вообще, получение в консоли QtCreator сообщения типа Программа неожиданно завершилась - верный признак того, что где-то осуществляется вызов метода у несуществующего, или неправильно созданного объекта, или указателя.