在 C++ 中被动使用 QtQuick / QML

Posted

技术标签:

【中文标题】在 C++ 中被动使用 QtQuick / QML【英文标题】:Using QtQuick / QML Passively with C++ 【发布时间】:2014-08-07 15:35:47 【问题描述】:

这里是资深 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 似乎已经经历了几次设计迭代。任何建议表示赞赏!

【问题讨论】:

如果你想用 C++ 做所有事情,你为什么还要使用 QML? 因为我想用Qt Quick GUI系统,而不是传统的Qt。 【参考方案1】:

如果您知道您感兴趣的商品的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");

【讨论】:

全局property 函数来自哪里?

以上是关于在 C++ 中被动使用 QtQuick / QML的主要内容,如果未能解决你的问题,请参考以下文章

将Qt的QML代码转换为C ++

将 QStandardItemModel 从 C++ 传递到 QtQuick / QML TableView 并显示它

Qt Quick - 如何仅通过 c++ 代码与 qml 属性交互

Qt和Qt Quick QML,

QtQuick 动画冻结在列表和打开的串口上

QtQuick 应用程序和 C++ 插槽绑定错误