2011-07-24 40 views
13

我需要能夠複製一個Qwidget,所以我可以複製一個窗口,因爲它會在運行時更改。這可能嗎?複製一個QWidget

void Duplicate(QWidget * Show) 
{ 
//I tried... 
Qwidget Shw = *Show; //but operator= is private 
//and the copy constructor (I think), which is also private 
Qwidget Shw(*Show); 
// 

Shw.Show(); 
} 

回答

11

這是設計。解決此問題的常用方法是實現一種方法(通常稱爲clone()),該方法允許您指定在複製類的實例時應應用的確切語義。這種方法還可以防止意外複製,比如容器類。

Qt docs

沒有拷貝構造函數或賦值操作符

的QObject既沒有拷貝構造函數也不是賦值運算符。 這是設計。實際上,它們是聲明的,但在私有 部分中使用了宏Q_DISABLE_COPY()。實際上,從QObject(直接或間接)派生​​的所有Qt類 都使用此宏聲明 其複製構造函數和賦值運算符是私有的。 推理可在Qt 對象模型頁面的Identity vs Value的討論中找到。

主要的後果是你應該使用指向QObject的指針(或者指向你的QObject子類的指針),否則你可能會試圖使用你的QObject子類的 作爲值。例如,如果沒有複製 構造函數,則不能將QObject的子類用作存儲在其中一個容器類中的值爲 。你必須存儲指針。