2010-03-02 38 views
3

我想用我的MainWindow提供的saveState()/ restoreState()函數保存自定義DockWidgets(從QDockWidget繼承)。如何保存自定義DockWidgets

我有兩個問題: 1.如何保存和恢復我的Dockwidgets?
- 我已經嘗試將我的自定義DockWidgets註冊爲QMetaType並實現默認構造函數,複製Constructor,Destructor和Streaming運算符。
2.如何識別加載的DockWidgets?
- 例如:如果2個DockWidgets保存並且我用restoreState()加載它們,有沒有辦法獲得指向這些加載的Widgets的指針?

感謝, 托比亞斯

+0

只檢查顯而易見的,但是你的MainWindow在保存之前是否有指向2個DockWidgets的指針? – MSalters

+0

我創建DockWidgets並將自己的指針保存到我自己的列表中。 我的自定義DockWidget被稱爲ConnectionWidget(繼承自QDockWidget)並且指針位於QList 列表中; 用addDockWidget將它們添加到MainWindow中。 如果我在saveState()之前調用findChildren ,我得到了所有的小部件。 我是否必須將指針保存到DockWidgets的其他位置? – Tobias

回答

2

您是否閱讀過QMainWindow::saveState文檔?

您的對象是唯一命名的嗎? (QObject::setObjectName

作爲一個側面說明,QObject對象不應該有一個拷貝構造函數,見Q_DISABLE_COPY

+0

是的,我讀了文檔,但我認爲它很短,並沒有告訴我有關.. saveState似乎工作我認爲,狀態變量保存到INI文件。但DockWidgets似乎並沒有在那裏保存... 是的,我只是添加了一個靜態計數器附加到所有對象名稱,僅用於測試目的。 我添加了複製構造函數,因爲我認爲它可能像註冊用於序列化的自定義元類型一樣工作。 感謝您提供有關複製構造函數的信息! – Tobias

+0

您是否在Dock部件的實例上調用了setObjectName?這是非常重要的,因爲Qt將這些名稱用於許多事情。從ini文件恢復是否適用於其他所有內容?如果沒有,我會檢查你用來保存和恢復的代碼,因爲saveState返回一個QByteArray,它可能被文件編碼破壞。 –

+1

是的,我創建了我的DockWidgets,然後在它們每個上用唯一的名稱調用setObjectName(name)。 保存目前通過settings-> setValue(「mainwindow/state」,this-> saveState())完成; 在寫入ini之前,我必須對QByteArray進行編碼/解碼嗎?我使用了與文檔中相同的代碼。 我的工具欄的大小和位置每次都保存和加載,所以我認爲它工作正常,但我的自定義DockWidgets不會被恢復(我不知道如何檢查它們是否已保存)。 – Tobias

1

我已經解決了問題2:
很容易..的QList < QDockWidget * > dockWidgetList = findChildren < QDockWidget * >();
但加載後列表當前爲空,因爲沒有加載小部件;)

1

看來你誤會了一些關於restoreState - (?它怎麼能這樣做呢),它不會重新創建停靠小部件但會恢復其位置和狀態(隱藏,自由或停靠)。在調用restoreState之前,您仍然需要手動創建Dock部件。

+0

好的,謝謝!我認爲它可以以某種方式序列化這些Widget,或者保存它們自動創建的類。所以我必須保存所有打開的DockWidgets列表,並在調用restoreState()之前再次在啓動時創建相應的DockWidgets(我認爲.. – Tobias