Qt程式設計之悲慘世界

獨木發表於2013-06-30

最近需要給人寫點基於QtWebkit的程式碼,算是領教了Qt程式設計的痛苦之處。

  1. QNetworkConfigurationManager::isOnline() 只有在編譯平臺上能執行,拷貝到其他Windows系統中一直返回false。
  2. Qt::WindowStaysOnTopHint在某些環境下經常無效。
  3. Qt4.8.4版本的QtWebkit在Win7 32bit 上播放YouTube視訊會出現崩潰現象。

每一點都是致命的,直接導致了遲遲無法收工。這幾天雖然染病在身,卻依然在各個不同的平臺上進行測試。有一些進一步的理解,但是沒有完美的解決方案。

1 對於QNetworkConfigurationManager::isOnline() 來說,雖然採用同一個Qt安裝包,可能的問題是 Qt 安裝包會在最後進行Platform Patch,替換QtCore.dll和QtNetwork.dll之類的檔案。這樣對於希望製作獨立的安裝來說簡直是一個噩夢。只有約定的msi安裝包如何完成也是一個問題。

*** 後來發現其中一個原因是沒有拷貝依賴的plugin檔案。Depends 里根本發現不了,執行程式時嘗試刪除plugin資料夾才找到所有依賴的plugin檔案。

 

2 Qt::WindowStaysOnTopHint在WinXP可以工作,但是Win7或者Win8下就有各種問題,時常無法將視窗置頂。比較詭異的是,將檔案放到一些資料夾下無效,換個資料夾又有效了,匪夷所思。

最後很無奈,加了以下的程式碼:

void MainWindow::showEvent(QShowEvent * event)
{
    if (event->type() == QEvent::Show)
    {
        activateWindow();
        setWindowFlags(this->windowFlags() | Qt::WindowStaysOnTopHint);
        SetTopMost();
    }
}

 

3 QWebView崩潰的位置還有所差別,一會是heap問題,一會是訊息處理問題,毫無頭緒。換成Qt5.0.2倒是沒有發現問題,就是依賴的檔案一下子增加了好多。

有時候使用Qt的話,還是挺悲慘的,很容易掉坑裡。這裡不免要吐槽一下,QtWebkit編譯一次就是幾小時,實在痛苦。

 

// QMainWindow 置頂
setWindowFlags(Qt::Widget | Qt::FramelessWindowHint | Qt::WindowSystemMenuHint | Qt::WindowStaysOnTopHint);

 

>  QtWebKitd4.dll!__NPN_DeallocateObject()  + 0xe bytes  C++
 
>  QtCored4.dll!QEventDispatcherWin32::processEvents(QFlags<enum QEventLoop::ProcessEventsFlag> flags)  Line 810  C++

 

 

相關文章