Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 归档体系结构的设置_Qt_Memory Management - Fatal编程技术网

Qt 归档体系结构的设置

Qt 归档体系结构的设置,qt,memory-management,Qt,Memory Management,我的Qt应用程序使用了很多单窗口qwidget,屏幕上没有父窗口。由于用户不再需要特定的窗口,为了将来的使用,他可能会将它们放入存档中,这样它们就不会再出现在屏幕上。如果用户在包含窗口名称的列表中打开存档,如果他单击某个条目,则窗口应重新显示。 我的问题是关于性能:在归档/应用程序启动时,是否每个窗口都应该创建一次,然后隐藏起来,以便在请求时重新显示,还是每个窗口都应该仅作为一个序列化字符串存在于内部列表中,在请求时始终从中重新创建窗口?重新创建有点慢,但考虑到台式计算机的速度,我不介意。这在手

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


在阅读有关windows的文章时,似乎windows并没有占用太多内存,所以我倾向于创建所有windows,而只是隐藏它们。这是一种好方法吗?

隐藏的小部件仍在侦听事件并存在于内存中,这意味着太多的小部件对应用程序性能没有好处。我会为这些小部件创建通用的可序列化基础,并将它们流式传输到数据容器,例如,vector Easter on memory或file可以在不使用时刷新到磁盘,但预期会重新启动。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;
}

是的,但为什么QWidgets没有父对象?我想用鼠标在桌面上移动它们。首先,争取按需创建windows。其次,只存储足以重新创建窗口的信息。