DDL就快到了晚上加班(迫真)和作业繁重、、、所以最近博客?更新,这几天的开发着实遇到了不少❓,譬如为应用添加Tcp?上传组件对QT c++基础较弱的我而言,仅研究+调试就消耗了相当的时间…总算是有能在期限前完成的希望了。
遇到的问题大致有几个:第一,每个NavigationItem的Page页面Title栏的隐藏问题,可以将title元素设为空(默认是“”),再将navigationBarTranslucency(状态栏透明度)设为1(完全透明),此外很多控件例如AppTextField等有backgroundcolor属性都可以将其设置为Qt.rgba(x,x,x,0)达成透明效果。需要注意的是设置NavigationBar透明度时如果同时import了QtQuick.Controlls 2.x版本这个属性会变得不合法,还没有找到原因,妥协办法是更换引用1.x版本。
第二:MouseArea的覆盖问题:比如
Rectangle{
MouseArea{ anchors.fill: parent; }
Text{
....
MouseArea{ anchors.fill:parent; }
会造成子控件MouseArea被覆盖的问题,解决方法是将MouseArea整合到一起,由于内层的MouseArea不能再用anchors定位,所以需要手动设定x,y,height,width等参数或者是利用z属性调整层次(自我感觉这样很容易造成层的混乱,对简单元件可以这样操作)之后即可正常使用。
第三:动态创建的组件间的参数传递问题与局部变量的设置问题
由于我用搜索引擎查询了关于函数Component.createObject()函数的用法却无果而终,便开始考虑能否用其他方式操作动态创建的组件(没有使用Loader),最后选择的方法是申请变量var储存动态创建的对象,举个例子
la = label.createObject(parent,{});
但是这种写法也有相当的弊端,普通来讲这个property var变量要申请在当前qml文件的根层元素中,很是不便,而且对于la的子元素直接操作也并非易事,于是有了这样的解决办法:(添加一个QtObject用于储存变量)
QtObject{
id: obj;
property var lab;
property bool isLabelNotCreated: true;
}
之后使用自带的Destroy()方法销毁即可
onClicked: {
if(obj.isLabelNotCreated){
obj.lab = label.createObject(parent,{});
obj.isLabelNotCreated = false;
}
else{
obj.lab.destroy(300);
obj.isLabelNotCreated = true;
}
}
此外,操作有多重嵌套的Component时可以在其中创建方法,利用id调用的方式处理:
Component{
id: label;
Image{
id: labimg;
function changeText(txt){
textField.text = txt;
}
function returnText(){
return textField.text;
}
signal dest();
source: "../assets/image/paper.png";
height: textField.height + dp(20);
width: textField.width + dp(10);
anchors.bottom: parent.top;
anchors.horizontalCenter: parent.horizontalCenter;
//(ps:这缩进十分不友好)
AppTextEdit{
id: textField;
anchors.top: parent.top;
anchors.topMargin: dp(5);
anchors.right: parent.right;
anchors.rightMargin: dp(4);
height: text.height;
width: text.width;
text: " ";
}
.......
//onDestroyed: {
//}
}
}
其他列如需要记录位置的散点使用repeater…等等如果有兴趣的问题可以回复再一起讨论。
最后重写(非原创) 了一份可用于v-play(felgo)的c++Tcp发送文件交互类并连接到前端,已经上传到csdn,有兴趣的可以看看,个人感觉还是蛮有价值的。