使用Q_PROPERTY和QString的NOTIFY项

时间:2015-03-31 17:19:13

标签: qt signals-slots qproperty

我有一个基于小部件的课程。它有两个私人QString成员。我希望能够在值发生变化时使用信号进行通知。所以对于这两个变量,我有一个setter和一个getter。我也有一个信号。

  • 问题:他们都可以使用相同的信号吗?或者我必须定义两个独立的信号?

然后 - 我想将该信号绑定到同一类中的一个插槽(我知道我可以调用插槽而不是发出信号 - 但我想使用信号)。

  • 如何连接它们?我试过了:

    connect( &invoiceFilterDirectionPart, SIGNAL(valueChanged(QString)), this, SLOT(invoiceFilterDirectionPart_valueChanged(QString)) );
    

但它没有编译 - 因为invoiceFilterDirectionPartQString,而connect期望第一个参数是QObject*

我可以在connect语句中使用this - 但就单个信号而言 - 我猜两个插槽都会触发?只有选项两个独立信号,然后在this语句中使用connect - 或者我错过了什么?

  • 上一个问题:我是否需要Q_PROPERTY来完成所有这些工作?当我第一次使用它时,它是某种神奇的宏 - 当我使用它时,就像这样:

    Q_PROPERTY(QString invoiceFilterContractorPart 
        READ getInvoiceFilterContractorPart
        WRITE setInvoiceFilterContractorPart
        NOTIFY valueChanged
    )
    

我认为它会自动神奇地生成变量,setter,getter和通知信号。可悲的是 - 这没有发生;)。它只是尖叫没有提到的项目存在。这就是它的全部吗?真的找不到一个好的用例...

1 个答案:

答案 0 :(得分:2)

据我所知,您不一定需要设置Q_PROPERTY,但由于invoiceFilterContractorPart似乎是您对象的属性,因此可以正确使用它。离开吧。

有一个valueChanged信号表示错误的思考财产的方式。假设invoiceFilterContractorPart是某个类Foo的属性:

class Foo : public QObject
{
    // ...

    Q_PROPERTY(QString invoiceFilterContractorPart 
        READ getInvoiceFilterContractorPart
        WRITE setInvoiceFilterContractorPart
        NOTIFY valueChanged
    )
}

然后外部对象被通知的是:

  

Foo类型的对象foo1说:'valueChanged'

而不是

  

invoiceFilterContractorPart说:'valueChanged'

因此,您需要更改信号,以便明确哪个属性已更改,例如将其重命名为invoiceFilterContractorPartChanged()

class Foo : public QObject
{
    // ...

    Q_PROPERTY(QString invoiceFilterContractorPart 
        READ getInvoiceFilterContractorPart
        WRITE setInvoiceFilterContractorPart
        NOTIFY invoiceFilterContractorPartChanged
    )
}

现在外部对象得到通知的是:

  

Foo类型的对象foo1说:'invoiceFilterContractorPartChanged'

这使您能够要求foo1.getInvoiceFilterContractorPart()等新值。

因此,您不会连接属性,而是拥有该属性的对象:

connect(this, SIGNAL(invoiceFilterDirectionPartChanged(QString)),
        someotherobject, SLOT(onFooDidInvoiceFilterDirectionPartChanged(QString)));

或其他一些班级Bar

connect(&foo1, SIGNAL(invoiceFilterDirectionPartChanged(QString)),
        this, SLOT(onFooDidInvoiceFilterDirectionPartChanged(QString)));