集成C ++和QML。 Qt 5.4

时间:2014-12-13 19:06:32

标签: c++ qml qt5.4

我正在阅读过去几个小时的Qt文档,试图找出一种方法,使用Qt Quick UI(QML)创建一个用C ++代码(函数等)进行通信(交互)的UI。

我已经在这里阅读了5或6个类似的问题,但我有点困惑,我有问题找出从哪里开始或先做什么。 如果有人能花时间并列出完成这项工作所需的步骤,我会非常感激。

到目前为止我做了什么。我尝试过...>添加新商品> C ++类,但我失败了,错误说:"无法将一个或多个文件添加到项目">似乎创建了文件(.. .cpp和.h),它们位于其他项目文件但未包含在项目中的文件夹中。 我想做的只是简单的事情,比如通过C ++函数或任何其他方式更改textedit的文本。

// Test.qml(main.qml)

    import QtQuick 2.1
    import QtQuick.Window 2.0

Rectangle {
     id: rootRect
    width: Screen.width/2
    height: Screen.height/2
    color: "gray"


    Button{}

    Rectangle{
        id: textField
        width: 120
        height: 40
        color: "white"
        x:274; y: 61
        border.color: "blue"
        border.width: 4
        radius: 2

    }

    TextEdit {

        id: display
        x: 274
        y: 61
        width: 80
        height: 20
        text: qsTr("Text Edit")
        font.pixelSize: 22
        color: "black"
        anchors.centerIn: textField

    }

    Rectangle{
        id: inputField
        width: textField.width
        height: textField.height
        border.color: "green"
        border.width: 3
        color: "white"
        x: 140; y: 61
    }

    TextEdit{
        id: input
        color: "red"
        font.pixelSize: 30
        anchors.centerIn: inputField
        text: "Some Text"


    }

}

// Button.cpl

import QtQuick 2.0
import QtQuick.Window 2.0


Item {

    property string defaultText: "New Text"


    Rectangle{
    id: button
    width: rootRect.width/6
    height: rootRect.height/8
    color: "black"
    x: 200; y: 200
    radius: 10

    }

    MouseArea{
        id: buttonClickArea
        width: 0
        anchors.rightMargin: 0
        anchors.bottomMargin: 0
        anchors.fill: button

        onClicked: {

                display.text = defaultText
        }
    }

}

感谢您抽出宝贵时间阅读本文和/或任何回复。

1 个答案:

答案 0 :(得分:13)

使用Qt 5.4.0和Qt Creator 3.3.0,创建新项目:

  1. 单击“新建项目”
  2. Qt快速申请
  3. 点击选择...
  4. 为项目命名并选择放置位置
  5. 点击下一步
  6. 从下拉菜单中选择Qt Quick 2.4
  7. 点击下一步
  8. 选择所需的套件
  9. 点击下一步
  10. 点击完成

  11. 现在您应该看到使用以下代码打开main.qml文件:

    import QtQuick 2.4
    import QtQuick.Window 2.2
    
    Window {
        visible: true
        MainForm {
            anchors.fill: parent
            mouseArea.onClicked: {
                Qt.quit();
            }
    
        }
    }
    

    将其更改为:

    import QtQuick 2.4
    import QtQuick.Window 2.2
    
    //### New Code ###
    
    import QtQuick.Controls 1.3
    
    //################
    
    Window {
        id: window1
        visible: true
    
        //### New Code ###
    
        width: 400
        height: 500
    
        TextArea {
            id: textArea
            readOnly: true
            anchors.bottom: textInput.top
            anchors.bottomMargin: 6
            anchors.right: parent.right
            anchors.rightMargin: 8
            anchors.left: parent.left
            anchors.leftMargin: 7
            anchors.top: parent.top
            anchors.topMargin: 7
        }
    
        TextField {
            id: textInput
            y: 470
            height: 23
            anchors.right: sendButton.left
            anchors.rightMargin: 6
            anchors.bottom: parent.bottom
            anchors.bottomMargin: 7
            anchors.left: parent.left
            anchors.leftMargin: 7
        }
    
        Button {
            id: sendButton
            x: 328
            y: 470
            width: 64
            height: 23
            text: qsTr("Send")
            anchors.bottom: parent.bottom
            anchors.bottomMargin: 7
            anchors.right: parent.right
            anchors.rightMargin: 8
    
            onClicked: {
                CppClass.sendMessage(textInput.text, textArea);
                textInput.text = "";
            }
        }
    
        //################
    }
    

    将C ++类添加到您的项目中:

    1. 右键单击项目查看器中的项目名称
    2. 点击添加新...
    3. 如果尚未选择,则选择C ++类
    4. 点击选择...
    5. 在班级名称中输入“CppClass”
    6. 将基类设置为QObject
    7. 点击下一步
    8. 点击完成

    9. 打开cppclass.h并将其更改为:

      #ifndef CPPCLASS_H
      #define CPPCLASS_H
      
      #include <QObject>
      
      //### New Code ###
      
      #include <QQuickItem>
      #include <QQuickTextDocument>
      #include <QTextDocument>
      
      //################
      
      class CppClass : public QObject
      {
          Q_OBJECT
      public:
          explicit CppClass(QObject *parent = 0);
          ~CppClass();
      
          //### New Code ###
      
          Q_INVOKABLE void sendMessage(const QString &msg, QQuickItem *textArea);
      
          //################
      
      signals:
      
      public slots:
      };
      
      #endif // CPPCLASS_H
      

      打开cppclass.cpp并将其更​​改为:

      #include "cppclass.h"
      
      CppClass::CppClass(QObject *parent) : QObject(parent)
      {
      
      }
      
      CppClass::~CppClass()
      {
      
      }
      //### New Code ###
      
      void CppClass::sendMessage(const QString &msg, QQuickItem *textArea)
      {
          QTextDocument *textDocument = textArea->property("textDocument").value<QQuickTextDocument*>()->textDocument();
      
          textDocument->setHtml(textDocument->toHtml() + "\n<b>Text sent to Cpp side:</b> <i>" + msg + "</i>");
      }
      
      //################
      

      打开main.cpp并将其更​​改为:

      #include <QGuiApplication>
      #include <QQmlApplicationEngine>
      
      //### New Code ###
      
      #include <QQmlContext>
      
      #include "cppclass.h"
      
      //################
      
      int main(int argc, char *argv[])
      {
          QGuiApplication app(argc, argv);
      
          QQmlApplicationEngine engine;
      
          //### New Code ###
      
          CppClass cppClass;
      
          engine.rootContext()->setContextProperty("CppClass", &cppClass);
      
          //################
      
          engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
      
          return app.exec();
      }
      

      运行您的应用程序,在输入字段中键入一些文本,然后单击“发送”。



      回应动态Remo评论这是让QML和C ++进行通信的另一种方式。这种方法基于C ++发出信号和QML作用于它。以下是使其运行的代码。


      cppclass.h

      #ifndef CPPCLASS_H
      #define CPPCLASS_H
      
      #include <QObject>
      
      #include <QDateTime>
      
      class CppClass : public QObject
      {
          Q_OBJECT
      public:
          explicit CppClass(QObject *parent = 0);
          ~CppClass();
      
          Q_INVOKABLE void getCurrentTime();
      
      signals:
          void timeUpdate(QString currentTime);
      
      public slots:
      };
      
      #endif // CPPCLASS_H
      

      cppclass.cpp

      #include "cppclass.h"
      
      CppClass::CppClass(QObject *parent) : QObject(parent)
      {
      
      }
      
      CppClass::~CppClass()
      {
      
      }
      
      void CppClass::getCurrentTime()
      {
          emit timeUpdate(QDateTime::currentDateTime().toString("ddd dd MMMM yyyy hh:mm:ss.zzz"));
      }
      

      的main.cpp

      #include <QGuiApplication>
      #include <QQmlApplicationEngine>
      
      #include <QQmlContext>
      
      #include "cppclass.h"
      
      int main(int argc, char *argv[])
      {
          QGuiApplication app(argc, argv);
      
          CppClass cppClass;
      
          QQmlApplicationEngine engine;
      
          engine.rootContext()->setContextProperty("CppClass", &cppClass);
      
          engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
      
          return app.exec();
      }
      

      main.qml:

      import QtQuick 2.4
      import QtQuick.Window 2.2
      import QtQuick.Controls 1.2
      
      Window {
          id: rootWindow
          width: 400
          height: 400
          visible: true
      
          Connections {
              target: CppClass
      
              onTimeUpdate: {
                  initailizeDllMsg.text = currentTime
              }
          }
      
          Text {
              id: initailizeDllMsg
              text: qsTr("{current time placeholder}")
              font.pointSize: 14
              anchors.horizontalCenter: parent.horizontalCenter
              anchors.verticalCenter: parent.verticalCenter
          }
      
          Button {
              id: button1
              x: 163
              y: 357
              text: qsTr("Show current time")
              anchors.bottom: parent.bottom
              anchors.bottomMargin: 20
              anchors.horizontalCenter: parent.horizontalCenter
      
              onClicked: CppClass.getCurrentTime()
          }
      }