2012-11-23 55 views
2

我正在創建一個Qt GUI,它將爲用戶生成一些表單,讓他們填充它們,然後將表單保存在二進制搜索樹中,然後將其序列化。這是使用Qt(顯然),C++和boost來完成的。圖形用戶界面是此時應用程序的唯一接口。我想在GUI之外實例化我的二叉搜索樹對象,因爲在主GUI類中創建它似乎是一個糟糕的設計模式。這是否正確?將Qt GUI與應用程序外部的對象一起使用

這裏是我的main()現在:

int main (int argc, char *argv[]) 
{ 
    QApplication app(argc, argv); 
    ChocAnGui *gui = new ChocAnGui; 
    gui->show(); 

    return app.exec(); 
} 

有沒有一種方法來創建一個BST對象的ChocAnGui類可以使用,但生活實際的GUI之外?我想這樣做:

int main (int argc, char *argv[]) 
{ 
    MyBST bst = new MyBST; 
    MyRecord record = new MyRecord; 

    QApplication app(argc, argv); 
    ChocAnGui *gui = new ChocAnGui; 
    gui->show(); 

    return app.exec(); 
} 

我會那麼喜歡GUI能夠呼籲MyBSTMyRecord類中的方法從內。因爲在應用程序的開始和結束時我會序列化和反序列化數據,所以這似乎是最抽象的方法(與GUI代碼本身的序列化和反序列化)。我希望這個問題很清楚......當我們說話時,我正在學習所有這些東西。有沒有辦法通過QApplication(argc, argv)通過這些變量?最終,記錄和BST類將被構建到數據庫中,並且再次,在GUI之外創建實例似乎是最直接的。感謝您提供的任何輸入。

+1

不知道我非常理解你在問什麼(?),但是如果你有一個GUI需要訪問但不「擁有」的數據結構,那麼通過一個指針或引用傳遞給GUI對象構造函數的參數是非常標準的做法。 *(例如'new ChocAnGui(bst)')*如果生命週期管理是一個問題,請考慮智能指針。 – HostileFork

+0

我想也許OP在Qt gui中使用了一種非常簡單的方法,只是在Qt Designer中創建一個表單並顯示它。但不做任何自定義類。 OP真的應該更深入地探索Qt的功能。 – jdi

回答

1

I th墨水時,只有當二進制搜索需要很長時間並可能阻止GUI線程時,才需要將二進制搜索樹放在GUI線程之外。 如果是這種情況下,你想要做的是把MyBST對象下另一個線程,

在主應用程序,創建一個新的線程將處理所有的BST操作:

QThread * BSTThread = new QThread(); 
BSTThread->start(); 

BSTThread是一個擁有自己的事件隊列的新線程。 然後,您創建MyBST對象,確保MyBST繼承QObject,並且可以在該對象上調用moveToThread方法。

MyBST * bst = new MyBST(); 
bst->moveToThread(BSTThread); 

當主應用程序想要與MyBST通信時,從主應用程序發出一個信號。使用Qt :: QueuedConnection將信號連接到MyBST類中的插槽,或者只使用Qt :: AutoConnection,它將自動進行排隊連接,因爲您的bst對象與主應用程序位於不同的線程中,並且插槽中的函數將由BSTThread執行。

而當bst對象想要與主應用程序進行通信時,還會發出一個信號,該信號連接到主應用程序中的插槽,該插槽將在您的mainThread中正確處理該插槽。通過這種方式,你的通信是異步的,當你向bst對象發送請求時,你不能立即得到結果,因爲你把它作爲一個信號發送,並且它被髮送到等待處理的BSTThread的事件隊列中。在BSTThread處理來自主應用程序的請求之後,它將結果回送給主線程的事件隊列,主線程處理結果並更新GUI。

我想你需要閱讀QT上的這個http://doc.qt.digia.com/qt/thread-basics.html,如果你想知道更多的細節。

+0

這正是我要找的。超級有用。萬分感謝。 – MCP

0

只需創建你的窗口申報MyBST成員:

class MyBST; 

class ChocAnGui 
    : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    ChocAnGui(MyBST* aBst = 0, QWidget *parent = 0); 
    MyBST *bst 

然後用你的對象初始化:

ChocAnGui *gui = new ChocAnGui(bst); 

或者你不能讓它的成員,讓你的GUI只是總是拿一個MyBST指針:

class MyBST; 

class ChocAnGui 
    : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    ChocAnGui(QWidget *parent = 0); 
    void doSomething(MyBST*);