2011-09-05 64 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對象的指針。