@igormitrakov
Начинающий разработчик

Как передать параметр в функцию класса родителя в Qt C++?

Здравствуйте. Возникла проблема при передаче параметра в функцию класса родителя средствами сигналов слотов.
Использовал лямбда функцию. Внутри класса всё передаётся замечательно.
parent.h
class Rashod : public QWidget
{
  Q_OBJECT
public:
  explicit Rashod(QWidget *parent = nullptr);
private:
  QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
  QVBoxLayout *vblay = new QVBoxLayout();
  QPushButton *add_btn = new QPushButton("Добавить");

public slots:
  void show_add_btn(QString s);
};


parent.cpp
void Rashod::show_add_btn(QString s)
{
  add_btn->show();
  QLabel *knt = new QLabel(s);
  vblay->addWidget(knt, 0);
  child *chuld = new chuld(this);
}


child.h
class add_widget : public QWidget
{
  Q_OBJECT
public:
  explicit add_widget(QWidget *parent);
private:
  QPushButton *add = new QPushButton("Добавить");
  QString FIO;
};


child.cpp
add_widget::add_widget(QWidget *parent) : QWidget(parent)
{
  connect(this->add, &QPushButton::clicked, [=](){parent->show_add_btn(FIO);});
}


child.cpp:31: ошибка: ‘class QWidget’ has no member named ‘show_add_btn’
connect(this->add, &QPushButton::clicked, [=](){parent->show_add_btn(FIO);});
^~~~~~~~~~~~
  • Вопрос задан
  • 74 просмотра
Пригласить эксперта
Ответы на вопрос 3
Zoominger
@Zoominger
Сись админ
Я очень давно не писал на Qt, но почему потомок у вас тоже наследуется от QWidget, как и родитель? Там ведь действительно нет такого мембера.
Ответ написан
vt4a2h
@vt4a2h Куратор тега C++
Senior software engineer (C++/Qt/boost)
У вас есть несколько вариантов:
1) Использовать старый синтаксис соединения и сделать show_add_btn слотом
2) Использовать qobject_cast в лямбде для преобразования объекта к нужному типу
3) Использовать static_cast для преобразования в лямбде, если вы уверен, что там именно тот объект
4) Переработать архитектуру, чтобы касты не были нужны совсем. Например, чтобы слот присоединялся к сигналу какой-нибудь фабрикой или её аналогом. Я голосую за этот вариант.
Ответ написан
@vanyamba-electronics
QObject::connect(this->add, &QPushButton::clicked, parent, &Rashod::show_add_btn);
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
AirNet Санкт-Петербург
До 200 000 руб.
Barbatum Барнаул
от 25 000 до 80 000 руб.
Элерон Москва
от 120 000 до 160 000 руб.
23 мая 2019, в 04:22
500 руб./в час
22 мая 2019, в 23:03
15000 руб./за проект
22 мая 2019, в 22:44
1000 руб./за проект