На этот вопрос задает два ответа. Первый из них прост и отвечает на вопрос напрямую и быстро, но НЕ РЕКОМЕНДУЕТ.
Я не хочу даже показать вам первый ответ, потому что это плохой дизайн и может привести к проблемам позже, но я решил показать это решение в любом случае, потому что он иллюстрирует концепцию области видимости переменной и почему вы не можете получить доступ к данным из одного функция, которая была передана через другую функцию.
Причина вы получаете эту ошибку компилятора, потому что параметры функции имеют только область в функции они определены в.
Что это означает, что в конструкторе Test
, трех параметров (QWidget *parent
, QString lang
и QString *filename
) доступны только внутри тела конструктора. Когда программный контроль выходит из конструктора, эти параметры уничтожаются, и вы больше не можете получать доступ к своим данным.
Если вы хотите получить доступ к данным в другой функции, как вы, очевидно, хотите сделать в void Test::on_pushButton_clicked()
, вам необходимо сохранить значения в элементе данных.
В коде значение parent
передается конструктору QDialog
и хранится там, так что вам не нужно делать ничего особенного с этим один, но вы не хранить значения lang
или filename
так что вы потеряете доступ к ним.
Для того, чтобы ваш код работать в своей текущей конструкции, вам необходимо сделать следующее изменение:
class Test : public QDialog{
// ...
private:
QString language;
QString *filename;
};
Test::Test(QWidget *parent, QString app_language, QString *f)
: QDialog(parent), language(app_language), filename(f), ui(new Ui::Report)
{
ui->setupUi(this);
}
void Test::on_pushButton_clicked()
{
*filename = "TEST CLASS";
}
Причина этого первый ответ является очень плохая идея, потому что вы всегда должны стремиться сохранить свой код как loosely coupled, как вы можете, и способ решения вашей проблемы создает очень плотную связь между вашим классом MainWindow
и вашим классом Test
.
Этот второй ответ показывает вам гораздо лучший способ решить вашу проблему с гораздо более слабой связью между классами. На самом деле класс Test
не имеет никаких знаний или соединений с классом MainWindow
в следующем коде.
class Test : public QDialog{
Q_OBJECT
public:
Test(QWidget *parent, QString app_language);
// ...
signals:
void filenameChanged(QString const &newFilename);
// ...
private:
QString language;
};
Test::Test(QWidget *parent, QString app_language)
: QDialog(parent), language(app_language), ui(new Ui::Report)
{
ui->setupUi(this);
}
void Test::on_pushButton_clicked()
{
emit filenameChanged("TEST CLASS");
}
// MAIN WINDOW CLASS
class MainWindow : public QMainWindow{
Q_OBJECT
public:
// ...
void showTestClass();
public slots:
void filename2Changed(QString const &newFilename);
private:
QString filename2;
QString app_language;
};
void MainWindow::showTestClass()
{
Test test(this, app_language);
connect(&test, &Test::filenameChanged, this, &MainWindow::filename2Changed);
test.exec();
}
void MainWindow::filename2Changed(QString const &newFilename)
{
filename2 = newFilename;
}
Механизм сигналов-слотов является основной особенностью Qt и является удобным примером создания сообщений Coupling.
Непонятно, что вы просите. –
Не могли бы вы быть более ясными? – danielfranca
Из класса MainWindow я вызываю новый класс «Test», а в конструкторе класса «Test» я посылаю указатель на имя файла, а в Test Class I меняю значение имени файла. После изменения я хотел бы получить новое значение в MainWindow Class. Таким образом я вызываю новый тест класса = новый тест (это, app_language, & filename2); – Mystery