2013-12-16 31 views
0

我有2類:一個保持一定的循環(在執法機關2-3分鐘;並且從QObject的繼承)和另一示出了一個進程對話框(從QDialog的繼承)。 我想在顯示對話框後立即啓動循環。我的第一個解決方案是:如何從exec()調用純函數?

int DialogClass::exec() 
{ 
    QTimer::singleShot(0, LoopClassPointer, SLOT(start())); 
    return __super::exec(); 
} 

從插槽拋出異常存在問題。所以我認爲有可能讓公衆插槽start()只是一個公共職能。但現在我不知道如何使它運作良好。像這樣的事情:

int DialogClass::exec() 
{ 
    LoopClassPointer->start(); 
    QApplication::processEvents(); 
    return __super::exec(); 
} 

沒有幫助。該對話框不會出現。 這種情況是否有共同的方法?

一些細節,根據問題:

  1. 我有一個與它自己的風格系統正常工作,所以我們有一個共同的做法建立任何對話框:從stytle類,它繼承了繼承他們來自QDialog。

  2. 我「LoopClassPointer」是從單獨的DLL導出類(在它裏面沒有UI支持)。

  3. 我在主應用程序的「啓動」按鈕,它具有狹槽,它創建進度對話框和「LoopClassPointer」相連。此時我在對話框中發送「LoopClassPointer」實例,並且不要在體系結構中進行重大更改。

+0

是什麼__super意思?你是否試圖訪問由編譯器創建和保留的對象? –

+0

不應該是其他方式嗎?進程啓動後應該立即顯示進度對話框? –

+0

這些對象是否都在同一個線程中運行?在你的代碼中,你不清楚你想要做什麼。在不同的物體之間進行通信的方式是將信號連接到一個插槽。所以你會將obj1的某些信號連接到obj2中的一個插槽,並在它開始時從obj1發出信號......是你正在嘗試做什麼? –

回答

0

在這種情況下,我建議你分開從對話框中循環的邏輯。桂元素應該始終保持分開。

這是偉大的,你的工人類是從繼承自QObject,因爲這意味着你可以啓動它在一個單獨的線程上運行: -

QThread* m_pWorkerThread = new QThread; 
Worker* m_pWorkerObject = new Worker; // assuming this object runs the loop mentioned 

// Qt 5 connect syntax 
connect(m_pWorkerThread, &QThread::started, m_pWorkerObject, &WorkerObject::start); 
connect(m_pWorkerThread, &QThread::finished, m_pWorkerThread, &QThread::deleteThis); 

m_pWorkerObject->moveToThread(m_pWorkerThread); 
m_pWorkerThread->start(); 

如果你不熟悉使用的QThread,然後通過讀this啓動。

你需要的唯一的另一件事是,定期從你的工人對象發送信號,其工作的進展,並連接到該對話框中的一個插槽,更新它的進度顯示。