這幾天在用QT做一個很帥的UI,準備把一個成熟的庫做一下整合。配好QT/QTWinMigrate,然後寫了些代碼,感覺基本上能夠運行,豈料QT給了我我一個下馬威:
QWidget: Must construct a QApplication before a QPaintDevice
看了QT的原始碼,其實就是QApplication沒有建立:
QWidgetPrivate::QWidgetPrivate(int version)
{
if (!qApp) {
qFatal("QWidget: Must construct a QApplication before a QPaintDevice");
return;
}
}
因為之前沒怎麼弄過QT,記得之前每次都是先建立幾個QApplication,然後調用QApplication::exec()進入迴圈。找了半天也沒有發現,卻沒有發現熟悉的字眼。可原來的例子可是可以用的。
由於手頭上的QT沒有原始碼,Build一個新的覺得動靜太大,沒有辦法,只能在小例子的代碼中狂加看到底QApplication是什麼建立出來的:
bool hasApp()
{
SMCP_ASSERT(qApp == NULL);
return qApp != NULL;
}
搞了很久,最終發現:
原來,那個的小例子在一個很不以前的地方做了一個InitializeComponent。因為它不起眼,而且似乎與我想提供的功能風馬牛不相及,所以注釋掉了而釀成大錯,白白耗費了不少時光。
網上很多人碰到了問題,是因為他們把Debug/Release的Dll混到一起,而我這裡,純粹就是因為QApplication沒有初始化。
後記:
今日想利用Webkit做一個非常簡單的WebBrowser,代碼寫就,覺得沒什麼問題,一Run,居然又碰到了這個錯誤。
QApplication自然是建立好了,那是不是我把Debug/Release的Dll混到一些了,用ProcessExplorer查看了一把,還真是,QtCored4, QtCore4之類的載入了一堆,無怪乎會有問題啦。
感謝ProcessExplorer,真是個好東西。