当变量在 QML 中更改其值时,如何在 Qt 中执行函数?
Posted
技术标签:
【中文标题】当变量在 QML 中更改其值时,如何在 Qt 中执行函数?【英文标题】:How to execute a function in Qt when a variable changes its value in the QML? 【发布时间】:2015-02-04 09:12:07 【问题描述】:error: no matching function for call to 'SimulationMode::connect(QString&, const char*, SimulationMode* const, const char*)'
QObject::connect (m_standingAgvID, SIGNAL (f(int)), this, SLOT (d(int)));
这里,m_standingAgvID
是QString
变量的对象,该变量也用于Q_PROPERTY
。
f(int) 和 d(int) 已在 cpp 代码的相应信号和插槽区域中定义和声明。
考虑:
QString 不发出信号。也许你应该告诉我们你是什么 试图达到。 – cmannett85
和
QString 本身不是一个QObject,它不能连接信号和槽。 – Tay2510
我有一个简单的变量,让我们说int
类型,它是一个类成员,我将它设为Q_PROPERTY
。
此变量将在QML
中设置。当它的值发生变化时,我想在Qt
中调用一个信号。
就是这样。
【问题讨论】:
QString
不发出信号。也许你应该告诉我们你想要达到的目标。
你在哪里声明了f(int)
?因为QString
肯定没有这样的成员(也没有信号/插槽)。
QString
本身不是QObject
,不能连接信号和槽。
@JBL "f(int) 和 d(int) 已在 cpp 代码的相应信号和插槽区域中定义和声明。"
【参考方案1】:
使用您关于int
s 的示例,可以这样完成:
class foo : public QObject
Q_OBJECT
Q_PROPERTY( int value READ getValue WRITE setValue NOTIFY valueChanged )
public:
explicit foo( QObject* parent = nullptr ) :
QObject parent , i_ 0
virtual ~foo()
int getValue() const return i_;
public slots:
void setValue( int value )
if ( value != i_ )
i_ = value;
emit valueChanged( i_ );
signals:
void valueChanged( int value );
private:
int i_;
;
简而言之,您必须手动发出有关成员的更改通知信号。
【讨论】:
那么,我应该在哪里用 c++ 编写代码,当该变量更改值时应该执行该代码? 好吧,如果你执行的代码在foo
里面,那么你可以把它放在setValue(int value)
里面,否则就像连接任何其他类一样连接到valueChanged
信号。
@TheIndependentAquarius 你读过关于Signals & Slots?的文件吗?这些例子可以帮助你理清思路。以上是关于当变量在 QML 中更改其值时,如何在 Qt 中执行函数?的主要内容,如果未能解决你的问题,请参考以下文章
Qt Quick - 如何仅通过 c++ 代码与 qml 属性交互
如何在 Cascades、Blackberry 10 中使用 Qt/QML/C++ 从另一个 qml 文件中更改一个 qml 文件中的标签文本?