2011-09-05 65 views
-2

我对Qt和C++一般都很陌生,所以这可能是一个简单的问题。Qt:执行从另一个类的追加

目前存在的问题:

我想执行的是通过调用另一个类的函数将文本到TextEditField功能。我可以调用函数和文本通过相同的类追加,但是当我尝试从另一个类调用它时,它不会执行追加并且不会出现错误。

为简单起见,我将只需要调用我的类A和B.

Class A // The class that was created automatically by Qt 
Class B // A class that i made myself 

A类有一个名为 “记录” 功能,它看起来像这样:

void ClassA::logger() 
{ 
    ui->Logg->append("A log message"); // Straight forward, it appends the text 
} 

我可以请拨打ClassA :: logger来自A类中的其他功能,一切正常,如下所示:

void ClassA::MakeALogg() 
{ 
    logger(); // The logger function appends the text to TextEditField Logg 
} 

但是,当我尝试从另一个函数执行记录器功能,它将无法正常工作。我当前的代码看起来像这样在ClassB的

void ClassB::MakeALogg() 
{ 
    ClassA A; 
    A.logger(); // The text doesn't get appended to TextEditField Logg via external class 
} 

调用记录仪()函数,并没有错误给地方时,这是行不通的。

最终的结果是让这个被启用以获得传递到logger()函数的QString,这是我现在可以在这个时候做的事,如果我通过相同的类调用它,例如ClassA::MakeALogg() to ClassA::logger(QString LogMSG)。但我想首先确保我可以从另一个类访问ui->函数。

我的理论

嗯,我想,问题在于以某种形式错过实例化的类此特定exection的(例如UI类型)。我可以在这个阶段调用A类到B类的函数,并返回{for example ClassA::GiveNumber() to ClassB::NumberCalculator()}。但是当它涉及到用户界面时,由于某种奇怪的原因无法建立联系。

我也试图在ClassB的的头文件,使关系到它,但没有工作,要么:

class ClassA; 

class ClassB 
{ 
public: 
ClassA * PointToClassA; 
} 

Void ClassB::Logger() 
{ 
PointToClassA = new ClassA; 
ClassA->logger(); 
} 
+0

在你的伪代码中似乎没有问题。你能做两件事吗?首先是切换一个断点,然后逐步进行(它在每个体面的IDE中,就像优秀的QtCreator一样)?第二点是:你可以发布你的实际代码,特别是'void ClassB :: MakeALogg()'方法吗? – Fezvez

+0

[Qt问题在处理类GUI访问时可能出现的重复](http://stackoverflow.com/questions/7311128/qt-problem-when-working-over-classes-gui-access) –

+0

所以你不喜欢对你的其他问题的答案,也不想等待一段时间来获得更好的答案?好的,在这种情况下,你只需要重新发布完全相同的问题;) –

回答

1

在这两个你的方法,你要创建一个新ClassA对象时,你会看到这个问题,如果你在本地变量称为show

void ClassB::MakeALogg() 
{ 
    ClassA A; 
    A.show(); 
    A.logger(); 
} 

所以,你应该呼吁已经存在的类实例的方法logger和这样做,你需要要么:

  • ClassA的指针传递给那些需要记录的所有类,
  • 使用ClassA静态函数或全局函数将呼叫路由到该实例(某种“Singleton模式”),
  • ClassB中发出信号,并将其连接到ClassA的插槽中,该插槽将执行日志记录(信号/插槽连接应该在ClassA中完成)。

如果只有2班,因为它似乎根据你给出了与“ClassB的:: NumberCalculator”或例子是情况下,如果其他类的所有实例都是ClassA唯一实例的孩子,第三种解决方案可能是最好的。

0

像在你的其他问题。每次你调用这个函数时,你都会创建一个全新的A类实例。这个函数实际上可以工作,但是你什么都看不到,因为在函数返回之后,你从类B方法返回并且本地对象被销毁。您必须为B提供一个指向或指向要调用此函数的实际A对象的指针。