当前位置: 首页 > news >正文

云端网站建设如何快速搭建网站

云端网站建设,如何快速搭建网站,网站建设内容存储,公司备案查询网站备案以前做.NET开发中#xff0c;.NET直接就集成了属性设计器#xff0c;VS不愧是宇宙第一IDE#xff0c;你能够想到的都给你封装好了#xff0c;用起来不要太爽#xff01;因为项目需要自从全面转Qt开发已经6年有余#xff0c;在工业控制领域#xff0c;有一些应用场景需要… 以前做.NET开发中.NET直接就集成了属性设计器VS不愧是宇宙第一IDE你能够想到的都给你封装好了用起来不要太爽因为项目需要自从全面转Qt开发已经6年有余在工业控制领域有一些应用场景需要自定义绘制一些控件满足特定的需求比如仪器仪表、组态等而且需要直接用户通过属性设计的形式生成导出控件及界面数据下次导入使用要想从内置控件或者自定义控件拿到对应的属性方法等首先联想到的就是反射Qt反射对应的类叫QMetaObject着实强大其实整个Qt开发框架也是超级强大的本人自从转为Qt开发为主后就深深的爱上了她在其他跨平台的GUI开发框架平台面前都会被Qt秒成渣Qt的跨平台性是毋庸置疑的几十兆的内存存储空间即可运行尤其是嵌入式linux这种资源相当紧张的情况下Qt的性能发挥到极致。接下来我们就一步步利用QMetaObject类和QtPropertyBrower第三方开源属性设计器来实现自己的控件属性设计器其中包含了所见即所得的控件属性控制以及xml数据的导入导出。第一步获取控件的属性名称集合。所有继承自QObject类的类都有元对象都可以通过这个QObject类的元对象metaObject()获取属性事件方法等。代码如下QPushButton *btn new QPushButton; const QMetaObject *metaobject btn-metaObject(); int count metaobject-propertyCount(); for (int i 0; i count; i) {QMetaProperty metaproperty metaobject-property(i);const char *name metaproperty.name();QVariant value btn-property(name);qDebug() name value; }打印输出如下objectName QVariant(QString, ) modal QVariant(bool, false) windowModality QVariant(int, 0) enabled QVariant(bool, true) geometry QVariant(QRect, QRect(0,0 640x480)) frameGeometry QVariant(QRect, QRect(0,0 639x479)) normalGeometry QVariant(QRect, QRect(0,0 0x0)) 省略后面很多…可以看到打印了很多父类的属性这些基本上我们不需要的那怎么办呢放心Qt肯定帮我们考虑好了该propertyOffset上场了。metaObject-propertyOffset()表示出了父类外自己类本身属性的偏移位置即索引开始的位置这下就好办了。代码改为QPushButton *btn new QPushButton; const QMetaObject *metaobject btn-metaObject(); int count metaobject-propertyCount(); int index metaobject-propertyOffset(); for (int i index; i count; i) {QMetaProperty metaproperty metaobject-property(i);const char *name metaproperty.name();QVariant value btn-property(name);qDebug() name value; }就是将i的起始位置改为偏移位置即可。打印输出如下autoDefault QVariant(bool, false) default QVariant(bool, false) flat QVariant(bool, false)这个过滤非常有用因为真实用到的大部分应用场景都是控件类本身的属性而不是父类的。第二步将控件类绑定到属性设计器。拿到了控件的属性是第一步接下来就是需要拿到属性所关联的方法等这里省略因为QtPropertyBrower这个屌爆了的第三方开源的属性设计器全部给我们写好了可以查看Qt帮助文档或者QMetaObject的头文件看到QMetaObject提供了哪些接口去获取或使用这些元信息。比如classInfo获取类的信息、enumerator获取枚举值信息、method获取方法property获取属性、superClass获取父类的名称等。QtPropertyBrower中提供了ObjectController类该类继承自QWidget这样的话我们在界面上拖一个QWidget控件鼠标右键提升为ObjectController即可。这个轮子造的不要太好我们只需要一行代码就可以让所有属性自动罗列到属性设计器中代码是ui-objectController-setObject(btn);看下效果如图 到这里是不是很兴奋呢任意控件都可以这样来展示自己的属性。在右侧动态更改属性会立即应用生效。第三步获取自定义控件的插件的所有控件。接下来这一步才是最关键的一步以上举例是Qt自带控件的如果是自定义控件插件比如就一个DLL文件呢怎么办放心办法肯定是有的。该插件类QPluginLoader上场了。通过QPluginLoader载入后的实例通过QDesignerCustomWidgetCollectionInterface类获取插件容器,然后逐个遍历容器找出单个插件包括获得类名图标。代码如下void frmMain::openPlugin(const QString fileName) {qDeleteAll(listWidgets);listWidgets.clear();listNames.clear();ui-listWidget-clear();//加载自定义控件插件集合信息,包括获得类名图标QPluginLoader loader(fileName);if (loader.load()) {QObject *plugin loader.instance();//获取插件容器,然后逐个遍历容器找出单个插件QDesignerCustomWidgetCollectionInterface *interfaces qobject_castQDesignerCustomWidgetCollectionInterface *(plugin);if (interfaces) {listWidgets interfaces-customWidgets();int count listWidgets.count();for (int i 0; i count; i) {QIcon icon listWidgets.at(i)-icon();QString className listWidgets.at(i)-name();QListWidgetItem *item new QListWidgetItem(ui-listWidget);item-setText(className);item-setIcon(icon);listNames className;}}//获取所有插件的类名const QObjectList objList plugin-children();foreach (QObject *obj, objList) {QString className obj-metaObject()-className();//qDebug() className;}} }效果图如下第四步实例化new出控件并放到窗体。拿到了所有的控件前面还有个对应控件的小图标是不是又有点小激动呢接下来就是怎么双击或者拖动该控件到界面上立马实例化一个控件出来。上一步我们将所有控件放到了一个链表变量listWidgets中该变量在头文件中定义如下QListQDesignerCustomWidgetInterface * listWidgets;这里写了个函数传入列表中控件的索引即该类的索引位置和控件默认要放置的坐标即可在主界面生成该控件。代码如下void frmMain::newWidget(int row, const QPoint point) {//列表按照同样的索引生成的,所以这里直接对该行的索引就行QWidget *widget listWidgets.at(row)-createWidget(ui-centralwidget);widget-move(point);widget-resize(widget-sizeHint());//实例化选中窗体跟随控件一起newSelect(widget);//立即执行获取焦点以及设置属性widgetPressed(widget); }第五步动态绑定控件到设计器。这一步就比较轻松了上面提到过直接获取当前界面上选中的是哪个控件遍历可以得到然后设置object到属性设计器控件即可。代码如下void frmMain::clearFocus() {//将原有焦点窗体全部设置成无焦点foreach (SelectWidget *widget, selectWidgets) {widget-setDrawPoint(false);} } void frmMain::widgetPressed(QWidget *widget) {//清空所有控件的焦点clearFocus();//设置当前按下的控件有焦点foreach (SelectWidget *w, selectWidgets) {if (w-getWidget() widget) {w-setDrawPoint(true);break;}}//设置自动加载该控件的所有属性ui-objectController-setObject(widget); }第六步导入导出控件属性到xml文件。这一步比较难本人也是花了好几个小时才搞定前后折腾了好多次因为遇到好几个棘手的问题比如有些自定义控件中其实里边封装了Qt自带的控件例如QPushButton等如果遍历控件设计窗体的所有控件也会把该控件也遍历进去所以要做过滤处理。导入xml数据自动生成控件代码如下void frmMain::openFile(const QString fileName) {//打开文件QFile file(fileName);if (!file.open(QFile::ReadOnly | QFile::Text)) {return;}//将文件填充到dom容器QDomDocument doc;if (!doc.setContent(file)) {file.close();return;}file.close();//先清空原有控件QListQWidget * widgets ui-centralwidget-findChildrenQWidget *();qDeleteAll(widgets);widgets.clear();//先判断根元素是否正确QDomElement docElem doc.documentElement();if (docElem.tagName() canvas) {QDomNode node docElem.firstChild();QDomElement element node.toElement();while(!node.isNull()) {QString name element.tagName();//存储坐标宽高int x, y, width, height;//存储其他自定义控件属性QListQPairQString, QVariant propertys;//节点名称不为空才继续if (!name.isEmpty()) {//遍历节点的属性名称和属性值QDomNamedNodeMap attrs element.attributes();for (int i 0; i attrs.count(); i) {QDomNode n attrs.item(i);QString nodeName n.nodeName();QString nodeValue n.nodeValue();//qDebug() nodeName nodeValue;//优先取出坐标宽高属性,这几个属性不能通过setProperty实现if (nodeName x) {x nodeValue.toInt();} else if (nodeName y) {y nodeValue.toInt();} else if (nodeName width) {width nodeValue.toInt();} else if (nodeName height) {height nodeValue.toInt();} else {propertys.append(qMakePair(nodeName, QVariant(nodeValue)));}}}//qDebug() name x y width height;//根据不同的控件类型实例化控件int count listWidgets.count();for (int i 0; i count; i) {QString className listWidgets.at(i)-name();if (name className) {QWidget *widget listWidgets.at(i)-createWidget(ui-centralwidget);//逐个设置自定义控件的属性int count propertys.count();for (int i 0; i count; i) {QPairQString, QVariant property propertys.at(i);widget-setProperty(property.first.toLatin1().constData(), property.second);}//设置坐标宽高widget-setGeometry(x, y, width, height);//实例化选中窗体跟随控件一起newSelect(widget);break;}}//移动到下一个节点node node.nextSibling();element node.toElement();}} }导出所有控件到xml文件代码如下void frmMain::saveFile(const QString fileName) {QFile file(fileName);if (!file.open(QFile::WriteOnly | QFile::Text | QFile::Truncate)) {return;}//以流的形式输出文件QTextStream stream(file);//构建xml数据QStringList list;//添加固定头部数据list ?xml version1.0 encodingUTF-8?;list QString(canvas width%1 height%2).arg(ui-centralwidget-width()).arg(ui-centralwidget-height());//从容器中找到所有控件,根据控件的类名保存该类的所有属性QListQWidget * widgets ui-centralwidget-findChildrenQWidget *();foreach (QWidget *w, widgets) {const QMetaObject *metaObject w-metaObject();QString className metaObject-className();QStringList values;//如果当前控件的父类不是主窗体则无需导出,有些控件有子控件无需导出if (w-parent() ! ui-centralwidget || className SelectWidget) {continue;}//metaObject-propertyOffset()表示当前控件的属性开始索引,0开始的是父类的属性int index metaObject-propertyOffset();for (int i index; i metaObject-propertyCount(); i) {QMetaProperty p metaObject-property(i);QString nodeName p.name();QVariant nodeValue p.read(w);//枚举值要特殊处理,需要以字符串形式写入,不然存储到配置文件数据为intif (p.isEnumType()) {QMetaEnum enumValue p.enumerator();nodeValue enumValue.valueToKey(nodeValue.toInt());}QString temp nodeValue.toString().toLocal8Bit().constData();values QString(%1%2).arg(nodeName).arg(temp);//qDebug() nodeName nodeValue;}//逐个添加界面上的控件的属性QString str QString(t%1 x%2 y%3 width%4 height%5 %6/).arg(className).arg(w-x()).arg(w-y()).arg(w-width()).arg(w-height()).arg(values.join( ));list str; } //添加固定尾部数据list /canvas;//写入文件QString data list.join(n);stream data;file.close(); }xml数据格式效果图完整效果图
http://www.zqtcl.cn/news/420892/

相关文章:

  • wordpress识别手机跳转网站3d视频动画制作
  • 展示型企业网站设计方案邯郸市口碑网络技术有限公司
  • 网站配色案例泰州seo平台
  • wordpress标题title优化代码seo技术顾问
  • 怎么做直播网站的超管延安免费做网站
  • 织梦做手机网站hao123从网上开始
  • 网站制作公司十强重庆网站建设mlfart
  • 南京调查公司网站杭州一起做网站
  • 不关站备案wordpress内网网站模板
  • 做学术用的网站如果在各大网站做免费的网络推广
  • 设计素材网站线上网站数据报表
  • 做一个小型网站多少钱wordpress 手机商城模板
  • 谷歌网站收录提交金山网站建设关键词排名
  • 域名备案中网站可以开通个人网站开发多少钱
  • 西安维护网站广州公司网站设计制作
  • 荆门做网站网络推广公司多久能回本
  • 搜索网站存在的关键字室内设计公司排名榜
  • 响应式网页开发昆明网站排名优化公司哪家好
  • 如东建设局网站线上购物平台
  • 重庆网站推广营销淘宝的网站怎么做的好
  • 重庆企业建站模板珠海企业官网设计制作
  • 网页作图软件东莞优化哪家好
  • 专业的商城网站开发深圳网站界面设计
  • 做网站需要自备服务器吗专业生产车间设计图纸网站
  • 用vs2010做网站教程昆明模板建站定制网站
  • dedecms网站模板下载做网站价格需要多少钱
  • 昆明餐饮网站建设建电影网站教程
  • 怎么做服装网站wordpress 主题 三栏
  • 个人可否建立网站全包装修
  • 哈尔滨网站建设贴吧网站建设推广好做吗