如何在重用QML组件时读写属性更改

时间:2014-08-19 10:34:51

标签: qt qml

我有像QMLDoubleEdit

这样的组件
import QtQuick 1.1
Item{
property double dVal: 0;
Rectangle {

    TextInput {
        id: textDVal
        focus:true
        validator:DoubleValidator{
            bottom:0;
            top:200;
            decimals: 3
        }           
        text: dVal           
    }
}

}

当它用于实现UI时,例如

Item{
property double dWesMax:    0;
property double dWesMin:    0;


Rectangle {       
    QMLDoubleEdit {
        id: edtMaxWes
        x: 40
        y: 50
        dVal: dWesMax
    }

    QMLDoubleEdit {
        id: edtMinWes
        x: 260
        y: 50
        dVal: dWesMin
    }
 }
 }

我可以从我的* .cpp代码中设置它的初始值,但是在更改后我无法读取它们:

//没关系

QDeclarativeContext *context=m_qmlFrmParam->rootContext();
    context->setContextProperty("dWesMax",m_wntModule->getWesMax());

//不是

double dVal=0;
dVal=(m_dlgRoot->property("dWesMax")).toDouble();

更好地解释一下: 1)创建UI

void frmWesParam::prepareElements(){
m_qmlFrmParam=new QDeclarativeView();
m_qmlFrmParam->setSource(QUrl("qrc:/view/wesparams/QMLBgPanel.qml"));
m_qmlFrmParam->setResizeMode(QDeclarativeView::SizeRootObjectToView);
m_dlgRoot=m_qmlFrmParam->rootObject();
QDeclarativeContext *context=m_qmlFrmParam->rootContext();
context->setContextProperty("viewerWidget",this);
}

void frmWesParam::setWesMax(double dVal){
m_dlgRoot->setProperty("dWesMax",QString::number(dVal));
}

2)显示它(只是元素行QMLDoubleEdit,两个按钮 - “确定”,“取消”onPress,发出接受或取消)

frmWesParam *vw=new frmWesParam();
vw->setWesMax(14.3);
vw->show();

3)当小部件出现时,它包含我的值 - 14.3。  用户可以在此更改,按下按钮; 4)接受信号接受

void frmWesParam::catchAccept(){
if(m_wntModule!=0){
double dVal=0;
dVal=(m_dlgRoot->property("dWesMax")).toDouble();
qDebug()<<dVal;
}     

在这里我只得到了我坐的setWesMax(...)。

2 个答案:

答案 0 :(得分:1)

正如我在评论中所说,更改TextInput中的值不会更改dWesMax属性。您应该在C ++中阅读text的{​​{1}}属性,或者在TextInput更改时更新dWesMax。以下是您如何做到这一点的示例:

<强> QMLDoubleEdit

TextInput

用户界面代码

import QtQuick 1.1
Item{
property double dVal: 0;
property var textChangedCb: null;
Rectangle {

    TextInput {
        id: textDVal
        focus:true
        validator:DoubleValidator{
            bottom:0;
            top:200;
            decimals: 3
        }           
        text: dVal
        onTextChanged: {dVal = text; if (textChangedCb) textChangedCb();}
    }
}

这不是最干净的方法,但它可以在不改变C ++代码和QML结构的情况下工作。

答案 1 :(得分:0)

基于W.B的帮助,我得到了另一个解决方案。

UI:

Item{
 property alias dWesMax:    edtMaxWes.dVal;
 property alias dWesMin:    edtMinWes.dVal;


 Rectangle {       
 QMLDoubleEdit {
     id: edtMaxWes
     x: 40
     y: 50
 }

 QMLDoubleEdit {
    id: edtMinWes
    x: 260
    y: 50
 }
}
}

QMLDoubleEdit:

Item{
 property double dVal: 0;

 Rectangle {
    TextInput {
        id: textDVal
        validator:DoubleValidator{
            bottom:0;
            top:200;
            decimals: 3
        }
        onTextChanged: {
            if(text.length>0){
              dVal=parseFloat(text);
            }
        }

    }
}
}