@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);});
^~~~~~~~~~~~
  • Вопрос задан
  • 558 просмотров
Пригласить эксперта
Ответы на вопрос 2
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);
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы