存档架构的设置

时间:2015-01-11 14:09:08

标签: qt memory-management

我的Qt应用程序在屏幕上使用了很多单个窗口(QWidgets没有父窗口)。由于用户不再需要特定的窗口,为了将来的使用,他可以将它们放入存档中,这样它们就不再出现在屏幕上了。如果用户打开存档,则在包含窗口名称的列表中,如果他单击某个条目,则应该重新显示该窗口。 我的问题是关于性能:在归档/应用程序启动时,每个窗口应该创建一次然后隐藏,在请求时重新显示它,或者每个窗口是否只作为内部列表中的序列化字符串存在,窗口总是在需要时重新创建?重新创建有点慢,但考虑到台式电脑的速度,我不介意。这在手持设备上可能有所不同。此外,我想知道是否有成千上万的隐藏窗口(每个窗口都有按钮,滑块,文本浏览器和所有gui东西)在Qt中使用了大量内存。

阅读Qt Performance tuning,似乎windows似乎没有占用更多内存,因此我倾向于创建所有内容并且只隐藏它们。这是一个好方法吗?

1 个答案:

答案 0 :(得分:0)

隐藏的小部件仍在侦听事件并存在于内存中,这意味着它们中的太多不能对应用程序性能有所帮助。我将为这些小部件创建公共的可序列化基础并将它们流式传输到数据容器,例如向量(更容易在内存中)或文件(可以刷新到磁盘)不使用但预计重新启动。 Serializing Qt类型非常方便。

您想要的架构蓝图:

class QWidgetS : public QWidget
{
// ...
public:
    template <typename T> static T* showDeserialize(QDataStream& strm)
    {
       T* pWidget = new T();   // create QWidgetS-based object
       pWidget->deserialize(strm); // restore object data
       pWidget->show();        // show the widget
       return pWidget;         // return the pointer to widget
    }

    virtual void serialize(QDataStream& strm);   // need to implement
    virtual void deserialize(QDataStream& strm); // individual child classes
// ...
};

/// sample serialization
void MyWidgetS::serialize(QDataStream& strm)
{
   strm << this->var1 << this->var2;
}

/// sample deserialization
void MyWidgetS::deserialize(QDataStream& strm)
{
   strm >> this->var1 >> this->var2;
}