我有一个Class MainWindow
在I类的一种方法中,以某种方式调用另一个类(“test”)
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";
}
但编译器因为未声明文件名而重新出现错误
我的问题是:
如何在Test Class的方法中使用filename并将新值返回给MainWindow Class?
答案 0 :(得分: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";
}
答案 1 :(得分: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,并且你解决问题的方式会在你的{{{{{{ 1}} class和你的MainWindow
类。
第二个答案向您展示了一种更好的方法来解决您的问题,类之间的耦合更松散。实际上,Test
类在以下代码中完全不了解Test
类。
MainWindow
Signals-Slots机制是Qt的核心功能,是设置Message Coupling的一个方便示例。