使用QtQuick / QML被动地使用C ++

时间:2014-08-07 15:35:47

标签: qt qml qt-quick qtquick2

退伍军人C ++和C#/ WinForms程序员,熟悉Qt / QML。

有很多关于如何从QML调用C ++的信息,而且我的工作得很好,但我宁愿被动地对待QML并且在C ++中操纵它可能的。

例如:

frmLogin::frmLogin()
{
    // Load QML file

    // Wire up controls to their own pointers
    cmdOK = QtQuick_GetControlFromQML("cmdOK");
    cmdQuit = QtQuick_GetControlFromQML("cmdQuit");
}

void frmLogin::Show()
{
    MyQMLPointerToWindow->Show();
}

void frmLogin::DoSomethingFromCPP()
{
    cmdOK->SetProperty("text", "I just changed the button text");
    rectBox->SetProperty("visible", true); // rectBox Rectangle from QML now appears on the screen

    frmMainMenu = new frmMainMenu(); // Create new main menu window
    frmMainMenu->ShowDialog(); // modal display
}

有办法做到这一点吗?是否非常沮丧?我试图制作一个多表单模态应用程序。很难在所有这些上找到直截了当的答案,因为看起来QtQuick已经经历了几次设计迭代。任何建议表示赞赏!

1 个答案:

答案 0 :(得分:4)

如果您知道自己感兴趣的项目objectName,可以使用QObject::findChild()

QQuickItem *okButton = findChild<QQuickItem*>("cmdOK");

如果按钮在QML中声明为属性:

Item {
    id: item

    property alias button: item.button

    Button {
        id: button
        text: "OK"
    }
}

然后您可以在C ++中将其作为属性访问:

QObject *button = property("button").value<QObject*>();
button->setProperty("text", "I just changed the button text");