当变量在 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_standingAgvIDQString 变量的对象,该变量也用于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】:

使用您关于ints 的示例,可以这样完成:

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 中执行函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何捕获 QML 中更改值的 Spinbox 事件?

更改后,QT QML资源文件不会重新编译

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

如何在 Cascades、Blackberry 10 中使用 Qt/QML/C++ 从另一个 qml 文件中更改一个 qml 文件中的标签文本?

如何在qt qml中更改地图上代表组件的颜色

Qt:如何在 C++ 端而不是 QML 上监视 Q_PROPERTY 更改