1

これは、StackOverflow に関する私の最初の投稿です。フォーマットの間違いがあった場合はご容赦ください。

Qt Quick Controls 1.1 を使用して Qt Quick UI プロジェクトを構築しています。QML コードに C++ アクション クラスに呼び出したい単純なボタンがあります。Qt の以前のバージョンでこれに関する多くの例を見ましたが、5.3 では動作しないようです。プロジェクト設定で Qt Quick Controls 1.1 を選択しました。これはそれほど複雑ではないはずですが、QtCreator 5.3 を使用した例が見つからないようです。

ここに私の main.qml ファイルがあります:

import QtQuick 2.2
import QtQuick.Controls 1.1
import QtQuick.Layouts 1.1

ApplicationWindow {
    id: parentWnd
    visible: true
    width: 640
    height: 480

    Action {
        id: actionSend
        onTriggered: console.log("SEND")
    }

    Button {
        id: send
        text: "Send Request"
        action: actionSend
        signal sendSignal()
    }
}

ここに私のmain.cppがあります:

#include <QApplication>
#include <QQmlApplicationEngine>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QQmlApplicationEngine engine;

    engine.load(QUrl(QStringLiteral("qrc:///main.qml")));

    return app.exec();
}

QMLボタンで「doSend」を呼び出すアクションクラスは次のとおりです。

#include<QDebug>
#include<QObject>

class Action : public QObject
{
    Q_OBJECT
public:
    Action();
public slots:
    void doSend();
};

最後に、ここに私のプロジェクトファイルがあります:

TEMPLATE = app

QT += qml quick widgets

SOURCES += main.cpp \
    action.cpp

RESOURCES += qml.qrc

# Additional import path used to resolve QML modules in Qt Creator's code model
QML_IMPORT_PATH =

# Default rules for deployment.
include(deployment.pri)

HEADERS += \
    action.h

これを実行すると、ボタンが表示され、コンソールへの「SEND」のログが表示されるので、QML アクションが正しく設定されていることがわかります。私のアクションクラスにアクション呼び出しを行う方法についての助けをいただければ幸いです!

4

1 に答える 1

0

ここで直面している 3 つの問題があります。

1 つ目は、クラスを QML に登録していないことです。Actionmain.cpp

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    qmlRegisterType<Action>("StevesModule", 1, 0, "Action");

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:///main.qml")));

    return app.exec();
}

2 つ目は、Actionが Qt Quick Controls モジュールの QML タイプであることです。ActionC++ のクラスについては何も知りません。ActionQt クイック コントロールのタイプの代わりに独自のクラスを使用する場合Actionは、QML ファイルにインポートする必要があります。

import StevesModule 1.0

doSend()3 つ目は、どこでもスロットを呼び出していないことです。これは、 ButtonのonClicked ハンドラーで行うことができます。

import QtQuick 2.2
import QtQuick.Controls 1.1
import QtQuick.Layouts 1.1
import StevesModule 1.0

ApplicationWindow {
    id: parentWnd
    visible: true
    width: 640
    height: 480

    Action {
        id: actionSend
    }

    Button {
        id: send
        text: "Send Request"
        onClicked: actionSend.doSend()
    }
}
于 2014-07-03T18:07:48.120 に答える