2011-02-24 20 views
2

我試圖找出其中C++ GUI工具包(+ STDLIB +的libc)這將是最容易實現在正常命令行應用程序這樣的有用的功能:如何在控制檯C++程序中創建一個簡單的非阻塞彈出窗口?

void ShowStringWindow(string& s) { 
    // ... 
} 

ShowStringWindow應顯示用的窗口包含字符串s的可編輯框。
它應該立即返回,所以主線程可以繼續。

注:

  • 如果主線程更改字符串顯示,字符串應該改變。 (主動檢查是否正常)
  • 如果用戶編輯了字符串(並確認輸入),字符串s應該更新。
  • 您可以假定主線程在更新時不會讀取或寫入此字符串。
  • 接下來調用ShowStringWindow會添加更多類似的窗口(或更多的窗口小部件到現有的窗口,如果這太難實施)。
  • 它應該在linux/ubuntu上工作。

我將非常感謝一個工作代碼,但這並不是必須有用的。

+0

你正在製作一個控制檯應用程序或Windows應用程序?你已經標記了Qt,wxWidgets等,但是沒有提及你在哪個框架下實現的框架,如果這些框架中的任何一個... – AJG85 2011-02-24 18:55:46

+1

http://stackoverflow.com/search?q=modeless+dialog – dalle 2011-02-24 19:02:50

+0

@ AJG85 :它明確寫道,它是標題和內容中的控制檯應用程序。 – 2011-02-25 00:32:58

回答

1

要使用Qt做到這一點,你需要:

  • 的字符串變量 創建一個互斥體。
  • 顯然創建一個線程。
  • 創建一個QApplication對象,在那個線程中 。 (在第一次調用時)
  • 在QApplication上將「setQuitOnLastWindowsClosed」 設置爲false。 (在第一次通話時)
  • 創建對話框並「執行」它。

的 「執行」 功能返回後,您需要:

  • 刪除對話框對象
  • 呼叫 的QApplication ::實例() - >退出();
  • 刪除QApplication對象。
  • 結束該線程。

有幾種方法可以從主線程更新數據。
一種方法是使用排隊連接類型的信號/插槽。使用這個,UI線程更新值。緩解對主線程的影響。但是,請注意,如果值更新速率過高(例如每秒2000次),則可能需要更改爲輪詢該值。要做到這一點,你可能會發現QTimer很有用。

更新數據到主線程應該更容易一些,只需鎖定互斥鎖並插入值即可。此時,您可以檢查我們以前從主線程獲得的值是否仍然是主線程中的當前值。你確實說它不會改變,但我不相信:)

我希望這是足夠的。我們用這個來爲控制檯程序創建一個基於Qt的錯誤對話框。

+0

我無法在QApplication之前創建QThread。 – 2011-03-15 19:27:03

+0

好吧,那是真的。我沒有使它成爲一個QThread :) – 0xbaadf00d 2011-03-16 08:30:50

+0

它適用於我雖然,你可以顯示一些代碼? – 0xbaadf00d 2011-03-16 09:47:33

相關問題