gpt4 book ai didi

qt - 如何将 QML 对象引用传递给 Qt C++?

转载 作者:行者123 更新时间:2023-12-05 00:57:52 25 4
gpt4 key购买 nike

我正在尝试创建类似 jQuery's autocomplete 的东西作为 QML 和 Qt C++ 中的小部件。为此,我创建了一个 C++ AutoCompleteListener QObject 的 child 然后注册它:

qmlRegisterType<AutoCompleteListener>(
"foo.AutoCompleteListener",0,1,"AutoCompleteListener");

然后,我实例化监听器和 AutoCompleteForm像:
import QtQuick 2.5
import com.foo.AutoCompleteListener 0.1

Item {
AutoCompleteForm { id: autocomplete_form }
AutoCompleteListener { id: listener }
}

如何传递对 QML 对象的引用 AutoCompleteForm进入 AutoCompleteListener ?

我尝试通过 autocomplete_form字段为:
Q_INVOKABLE void set_autocomplete_form(QQmlComponent *autocomplete_form);

onCompleted信号:
Item {
AutoCompleteForm {
id: autocomplete_form
Component.onCompleted: {
console.log("AutoCompleteForm completed");
listener.set_autocomplete_form(autocomplete_form);
}
}
AutoCompleteListener {
id: listener
Component.onCompleted: {
console.log("AutoCompleteListener completed");
}
}
}

但是,引用是 nullptr即使两者 AutoCompleteListenerAutoCompleteForm已实例化:
Instantiating AutoCompleteListener and parent is  QObject(0x0)
qml: AutoCompleteListener completed
qml: AutoCompleteForm completed
Setting autocomplete_form = QObject(0x0)

如何获得对 AutoCompleteForm 的引用或 AutoCompleteListener的 QML parent ?我想避免爬下整个 QML 层次结构,例如:
QObject* f = mView.rootObject();->findChild<QObject *>("AutoCompleteForm");

我计划支持并行实例化多个 AutoComplete 小部件,因此操作 QML 对象的相对路径 ( ../AutoCompleteForm) 似乎比必须爬过树更好。

最佳答案

How can I pass a QML object reference into Qt C++?



你不能 , 该语言不是为此而设计的。但是您可以使用 findChild 从 C++ 中获取引用。并找到 child 。但请阅读以下内容以获得真正的解决方案。

另外,我认为您的问题是关于 XY Problem .你有问题 X 你认为 解决了,所以你问 .

您原始问题的正确解决方案:

I am attempting to create something like jQuery's autocomplete as a widget in QML and Qt C++.



为了解决您的 真实 您需要正确使用属性绑定(bind)的问题。 QML 是一种声明性语言,对命令式编程的痴迷使得它很难简单明了。
将此模式用于 QML:
AutocompleteForm{
id: form
text: "Search here..."
suggestedTerms: helper.results
}
AutoCompleteHelper{
id: helper
searchFor: form.text
}

而对于 C++ 实现
class AutoCompleteHelper : public QObject
{
Q_OBJECT
Q_PROPERTY(QString searchFor READ searchFor WRITE setSearchFor NOTIFY searchForChanged)
Q_PROPERTY(QStringList results READ results NOTIFY resultsChanged)
public:
AutoCompleteHelper() {}
virtual ~AutoCompleteHelper() {}
QString searchFor() const { return m_searchFor; }
QStringList results() const { return m_results; }

public slots:
void setSearchFor(QString searchFor)
{
if (m_searchFor == searchFor)
return;
m_searchFor = searchFor;
emit searchForChanged();

// 1. Search for it...
// 2. Some time later fill m_results
// 3. Then: emit resultsChanged()
}
signals:
void searchForChanged();
void resultsChanged();

private:

QString m_searchFor;
QStringList m_results;
};

然后你会看到它神奇地工作,因为一旦你改变了 form.text,绑定(bind)就会在 helper.searchFor 中设置值,然后立即触发 C++ 插槽,你甚至可以在其中做出即时 react ,并且在 C++ 中发出 resultsChanged( ) 神奇地填充 form.suggestedTerms。

你会发现这个模式非常有效,所以你甚至想通过在 C++ 中重新启动一个计时器来延迟它 .此外,它还具有精美的声明性和清洁性。

关于qt - 如何将 QML 对象引用传递给 Qt C++?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34006480/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com