背景
昨晚刚建立qt工程,点击运行,工作可以直接使用,但是早上点开工作,就出现type类型错误。有点奇怪。问题页面显示,问题主要就是ui::widget的类型错误。
这篇文章提醒我,昨晚因为在尝试修改一些参数时,将objectName的Widget修改为uart。这说明窗口的objectName直接映射到Widget.cpp的类定义中,并且这种修改是无法实时同步的。换言之,所有窗口控件的命名等修改,需要手动修改到文件端嘛?这种修改是否效率太低。
下图显示,运行的窗口界面是Widget,与objectName是一样的,所以猜想直接修改objectName,可以修改窗口的名字。但是右上角对象窗口显示,每添加一个控件,就会相应显示一个对象和类。如hello world字符的对象是lable,类是QLable。然而,修改这种对象的名字并不会改变程序窗口的hello world内容。换言之,修改objectName不会修改运行程序界面的显示内容。
打开widget.cpp文件,特意修改Ui::widget为Ui::wid,以同步ObjectName的命名。结果显示错误:Cannot initialize a member subobject of type 'Ui::Widget with an rvalue of type 'Ui::Wid
#include "widget.h"
#include "./ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Wid)
{
ui->setupUi(this);
}
Widget::~Widget()
{
delete ui;
}
这个表达说明,Ui::Widget是工程建立后,实际存在type,objectName指代的内容是其 member subobject。objectName需要保持与这种type名的一致。
objectName与Ui:Widget同步
前面说到,修改objectName是无法同步Widget.cpp文件中的Ui::的这个描述。但是当然选择直接右键点击修改对象名称时,却实现了这种同步效果。说明修改objectName的效果是有限的,需要直接右键修改。
关于如何修改运行窗口的名字,属性页面中的windowTitle可以实现这种效果。
后记:这个文章提醒我,从错误中学习的可行中。每次出现这种微小的错误,都可以由此出发, 通过实践和逻辑分析,收获新的理解。这种把错误当成踏脚石的观念可以比较好的提升学习效率。