前面自己定义了一些控件可以实现一些显示功能,现在需要把控件保存成xml 文件,然后打开文件可以把控件显示在页面上。
2023-09-20 16-43-52
功能比较简单在原来的页面class 中增加两个函数来实现这个功能。
void loadWidgetFromFile(QString Path);
void SaveWidgetToFile(QString Path);
保存控件到xml 中
通过调用 QXmlStreamWriter来写xml 文件,首先获取页面中的所有widget list,包含页面自身,保存的时候可以去掉。
QList<QWidget*> allWidgets = this->findChildren<QWidget*>();
然后获取控件的名字和位置,大小,保存到xml中
writer.writeStartElement("Widget");
writer.writeAttribute("title", widget->windowTitle());
writer.writeAttribute("x", QString::number(widget->pos().x()));
writer.writeAttribute("y", QString::number(widget->pos().y()));
writer.writeAttribute("width", QString::number(widget->size().width()));
writer.writeAttribute("height", QString::number(widget->size().height()));
writer.writeEndElement();
加载xml文件还原控件
通过QXmlStreamReader来读取xml 文件,在读取控件的名字和位置
QString title = reader.attributes().value("title").toString();
int x = reader.attributes().value("x").toInt();
int y = reader.attributes().value("y").toInt();
在调用工厂类来生成控件
void QNewPageTable::addChildWidget(QString name,int x,int y)
{
std::unique_lock<std::mutex> its_lock(mutex_);
pPlug=componentFactory::getInstance()->CreateComponent(name);
if(pPlug!=nullptr)
{
componentNum++;
connect(pPlug,SIGNAL(clicked(bool,QObject *)), this, SLOT(slotWidgetClicked(bool,QObject *)));
connect(pPlug,SIGNAL(customContextMenuRequested(const QPoint &)), this,SLOT(slotcustomContextMenuRequested(const QPoint &)));
pPlug->setContextMenuPolicy(Qt::CustomContextMenu);
pPlug->setParent(this);
pPlug->setComponentIndex(componentNum);
widgetIndex.insert(componentNum,pPlug);
pPlug->setValue(20);
pPlug->setWindowTitle(name);
pPlug->move(x,y);
pPlug->show();
QMetaObject meta = pPlug->getQMeat();
emit showObjectProperty(meta,pPlug);
}
}