簡體   English   中英

將Qt GUI添加到動態庫

[英]Adding a Qt GUI to a Dynamic Library

問候溢出。 我正在嘗試將GUI添加到現有項目中。 更具體地說,是作為.so文件加載的插件(或者在win32上編譯時.dll

該項目已經有自己的線程實現來處理可移植性。 我知道Qt有自己的跨平台線程模型,但最好留在現有的線程模型中。

我對Qt老手的問題[我剛剛開始閱讀文檔]是:如上所述,是否可以使用Qt將GUI嵌入到插件中? 該插件已經是一個命令行界面,我希望GUI可選,即使它已編譯。由於這些標准函數被主程序調用,GUI(我假設將存在於另一個線程中)將不得不可訪問或能夠調用方法,以便CLI線程可以共存,標准函數可以與兩個接口的任何排列一起使用。

編輯1:

在使用代碼后,我可以從插件中啟動一個簡單的GUI。 該插件已經是CLI,並具有從主程序調用的功能。 我只是在初始化插件時創建了一個新線程,並從那里啟動了阻塞GUI:

QApplication app(NULL, NULL);
window = new zGui;
window->show();
app.exec();

這里的問題是:是否可以與GUI通信或者從CLI線程訪問GUI元素?

編輯2:一些結果

好吧,到目前為止,在一個單獨的線程中啟動阻塞GUI已經沒有問題。 我也可以從主插件線程訪問GUI中的小部件。 據我所知,這種做法不僅僅是因為我到目前為止收到的答案,而且Qt庫正在吐出一些關於另一個線程不安全訪問的警告。

截至目前我只在linux環境中工作,也許真正的問題將在其他系統上呈現。 我只看到一個我無法肯定的故障是相關的:

更改進度條小組件的最大值和最小值后,進度條顯示為空白。 我能夠通過以下方式對此進行簡單的修復

//here is me setting the values
window->progressBar->setMaximum(character.maxHP);
window->progressBar_2->setMaximum(character.maxMP);
window->progressBar->setValue(character.curHP);
window->progressBar_2->setValue(character.curMP);

//and here is the fix
window->progressBar->setVisible(false);
window->progressBar->setVisible(true);
window->progressBar_2->setVisible(false);
window->progressBar_2->setVisible(true);

我想我的最后一個問題是“從其他線程訪問Qt GUI不安全的原因是什么?為什么?”

您可以使用從非Qt應用程序調用的dll中的Qt GUI,但它不能來自輔助線程,它必須在主線程中運行。 應用程序事件循環通過阻塞方法啟動,該方法在GUI關閉時返回,因此如果您需要在應用程序中運行獨立於GUI的邏輯,那么該邏輯需要在輔助線程中運行。

如果您覺得有野心,可以修改QCoreApplication和QEventLoop類,以便您可以從調用應用程序管理事件循環,並且可能不會那么困難。 但據我所知,開箱即用Qt無法做到這一點。

考慮到Gerald的回答,我是否可以建議將CLI(您的應用程序)與您的應用程序GUI(ergo,一個單獨的應用程序)分開更好。

使您的GUI應用程序在后台使用cli。 它很容易通過使用QProcess完成。

干杯!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM