2015-05-31 2 views
-2

У меня есть класс MainWindowC++ конструктор

В одном из метода класса я называю другого класса ("тест") на пути

test = new Test (this,app_language,&filename2); 

Тест класс:

Test::Test(QWidget *parent,QString lang, QString *filename) 
: QDialog(parent) 
, ui(new Ui::Report) 
{ 
    ui->setupUi(this); 
} 

Один из методов Испытательный класс I таким образом изменяет значение имени файла

void Test::on_pushButton_clicked() 
{ 
    filename = "TEST CLASS"; 
} 

но компилятор reutrns ошибка, потому что имя файла не был объявлен

Мой вопрос:

Как использовать имя файла в методах тестирования класса и вернуть новое значение MainWindow класса?

+2

Непонятно, что вы просите. –

+1

Не могли бы вы быть более ясными? – danielfranca

+0

Из класса MainWindow я вызываю новый класс «Test», а в конструкторе класса «Test» я посылаю указатель на имя файла, а в Test Class I меняю значение имени файла. После изменения я хотел бы получить новое значение в MainWindow Class. Таким образом я вызываю новый тест класса = новый тест (это, app_language, & filename2); – Mystery

ответ

0

В классе вы должны добавить элемент, как это:

class Test 
{ 
// ... 
    void setFilename(const QString& aFilename) { m_Filename = aFilename; } 
    QString filename() const { return m_Filename; } 

private: 
    QString m_Filename; 
}; 

и во всей функции передать const QString& вместо QString*. После этого будет скомпилирован ваш код:

void Test::on_pushButton_clicked() 
{ 
    m_Filename = "TEST CLASS"; 
} 
+0

Мне нужно вернуть новое значение в класс MainWindow. – Mystery

+0

Какое новое значение? –

+0

У меня есть в MainWindow Class QString имя_файла2 и в тестовом классе я хотел бы изменить значение и отправить его обратно – Mystery

0

На этот вопрос задает два ответа. Первый из них прост и отвечает на вопрос напрямую и быстро, но НЕ РЕКОМЕНДУЕТ.

Я не хочу даже показать вам первый ответ, потому что это плохой дизайн и может привести к проблемам позже, но я решил показать это решение в любом случае, потому что он иллюстрирует концепцию области видимости переменной и почему вы не можете получить доступ к данным из одного функция, которая была передана через другую функцию.


Причина вы получаете эту ошибку компилятора, потому что параметры функции имеют только область в функции они определены в.

Что это означает, что в конструкторе 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.

Смежные вопросы