2010-03-02 35 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