0

我让一个程序工作不同的 qml 文件,首先显示一个获取 idClient 的屏幕,单击一个按钮并发布一个帖子(它工作正常),其次,新屏幕获取 idVent,单击一个按钮并发布一个帖子(这也有效) ,最后第三屏显示了很多数据。我的问题是有时可能会在 post 方法中出错,我会显示一条错误消息(这会随着按钮消失),并且我给出了字符串说错误的参数(如何显示字符串不是问题,问题是如何通过字符串)。

我将有一个加载器元素,如果我不包含错误管理,则可以正常工作。而且我不想在 qml 中实例化 C++ 对象(例如我的 Httppost 类)。我的 qml 代码是这样的:

Loader {
    id: pageLoader // ID needed for so we can later delete the item
    source: "AnimationSplash.qml"
    focus: true
    property bool valid: item !== null
    anchors.horizontalCenter: parent.horizontalCenter
    objectName: "switchPages"
}

Timer {
    id: firstPhaseTimer
    interval: 750
    running: true
    repeat: false

    onTriggered:{
        pageLoader.item.opacity=0;
        pageLoader.source="SearchRecipient.qml"
    }
}

Connections{
    target:pageLoader.item
    ignoreUnknownSignals: true
    onPostIdClient: {
        postClient(pageLoader.typeId, pageLoader.textIdClient)
    }
    onPostIdVent: {
        postVent(pageLoader.textIdVent)
        pageLoader.source="MainView.qml"
    }
}

postIdClient 和 postIDVent 是来自加载文件的信号,但是如果我的错误管理是在 C++ 中,那么任何人都知道如何更改 ErrorScreen。

我的 C++ 构造函数代码(我加载 main.qml 文件的位置)是这样的:

  QObject *mainObject;
  QQuickView view;

  view.setSource(QUrl::fromLocalFile("./ui/main.qml"));
  view.setResizeMode(QQuickView::SizeRootObjectToView);
  view.show();


  mainObject=view.rootObject();

  QObject *switcher=mainObject->findChild<QObject*>("");
  if(mainObject)
  {
     QObject::connect(mainObject, SIGNAL(postClient(QString,QString)), this, SLOT(postingClientData(QString,QString)),Qt::UniqueConnection); 
     QObject::connect(mainObject, SIGNAL(postVent(QString)), this, SLOT(postIdVent(QString)),Qt::UniqueConnection); 
  }  

最后,如果我无法从 QQuickView 的子 QObject 访问,如何读取和设置 MainView 的属性(我使用这个类来加载 main.qml)

4

1 回答 1

0

我得到了关键的答案,我使用一个变量属性来保持对页面的控制,并在 main.qml 中声明新信号,当加载项目的信号被执行时发送这个信号,在 C++ 中当注册错误时发送,我调用 qml 函数,并给出字符串错误如何参数。但是如果我使用加载器组件加载,我没有获取和管理我的 mainView.qml(显示所有数据时的屏幕)的形式,实际上我加载 main.qml 中的组件,我显示代码。

Rectangle{
   width: 535
   height: 700
   color: "#939393"
   id: main

   signal changePage()//string page, variant data, int state)

   property alias pageLoaded: pageLoader.item
   signal postClient(string typeId,string textIdClient)
   signal postVent(string textIdVent)

   property int page
   property string messageError: ""

   onChangePage:{
      mainViewofProgram.opacity=1
   }


   Loader {
     id: pageLoader // ID needed for so we can later delete the item
     source: "AnimationSplash.qml"
     focus: true
     property bool valid: item !== null
     anchors.horizontalCenter: parent.horizontalCenter
     objectName: "switchPages"
   }

   Timer {
    id: firstPhaseTimer
    interval: 750
    running: true
    repeat: false

    onTriggered:{
        pageLoader.item.opacity=0;
        pageLoader.source="SearchRecipient.qml"
        }
    }


   MainView{
      id:mainViewofProgram
      opacity: 0
      width: parent.width
      height: parent.height
      objectName: "facturador"
   }


   Connections{
     target:pageLoader.item

     ignoreUnknownSignals: true

     onPostIdClient: {
        postClient( typeId, textId)
        console.log(typeId,textId)

        if(messageError=="")
        {pageLoader.source = "SearchVent.qml"}

        else
        {pageLoader.source = "ErrorServer.qml"
            page=1}
        }

    onPostIdVent: {
        postVent(textIdVent)

        if(messageError=="")
           {
            pageLoader.source=""
            pageLoader.opacity=0
            changePage()
            }
        else
        {pageLoader.source = "ErrorServer.qml"
            page=2}
        }


    onReturnPreviusPage:
       {
        if(page==2)
            pageLoader.source="SearchVent.qml"
        if(page==1)
            pageLoader.source="SearchRecipient.qml"
       }

    }
  }
于 2013-10-25T17:26:40.177 回答