所以,我認爲我已經在網上進行了相當徹底的搜索,沒有發現真正有用的東西(只是混淆了最多......)。有沒有什麼方法可以在不使用動態內存的情況下使用Qt?
我想知道我如何可能(如果可能)使用Qt與非動態內存。我面對的問題是,對於很多小部件,我確切知道我想要使用的是什麼(這些子小部件,這些佈局,固定數字等)。然而,當你不使用動態內存時,Qt中的所有東西似乎都會阻礙你。一個簡單的例子是QLayout
,其中from the Qt documentation被設計爲擁有它添加的任何東西的所有權。所以基本上,下面的代碼:
//In header
class ThumbnailDialog : public QDialog
{
Q_OBJECT
public:
ThumbnailDialog(QWidget* parent = 0);
~ThumbnailDialog(void);
private:
QPushButton m_confirm;
QPushButton m_cancel;
QHBoxLayout m_buttonsLayout;
};
//Implementation of ctor
ThumbnailDialog::ThumbnailDialog(QWidget* parent):
QDialog(parent)
{
//...
m_buttonsLayout.addWidget(&m_confirm);
m_buttonsLayout.addWidget(&m_cancel);
//...
setLayout(&m_dialogLayout);
}
...將結束(在MSVC)在調試斷言失敗_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
,因爲在ThumbnailDialog
的析構函數,佈局嘗試刪除按鈕...這顯然不應該。
那麼,我是否被迫在各處都使用動態內存,as this "Qt Expert"擁護者(雖然提到「堆」,雖然......)?這似乎是錯誤的,因爲這會阻止利用RAII(如果父子關係意味着會有刪除,那麼我不能用智能指針來做我想的)。使用動態內存來編譯時已知的事情也會感覺非常錯誤......(但我可能是錯的,那只是我的感覺)。
因此:有沒有任何方式使用Qt,而不訴諸動態內存和new
s爲每個小工具/佈局?
我認爲Qt是以這種方式設計的。但是,如果它保證在父母被銷燬時刪除子對象 - 這也是可接受的方法。 – vahancho
@vahancho不,它不是,至少對我而言。讓「新」完全在野外使得代碼容易受到可能在ctors中發生的異常的影響。另外,「新」事物可能只是簡單的成員,但效率低下(雖然在我的情況下我可以克服它,因爲我沒有那麼多項目),但在概念上也是錯誤的。 – JBL
@JBL,我認爲你是在反思這個。如果您正在使用QT(或任何其他UI庫),請說再見,以確保這些小事情的效率。它們建立在層層傳遞價值層上而不做任何事情,一對夫婦'新'不會改變任何東西。這在概念上也不是錯誤的。如果您可以即時分配大量對象,則無需將其設置爲靜態,並強制將其寫入可執行文件並存儲在磁盤上。更不用說後面你會後悔沒有能夠有一個更動態的用戶界面。 – Shahbaz