将 Q_PROPERTY 与 NOTIFY 项一起用于 QString

using Q_PROPERTY with a NOTIFY item for a QString

我有一个基于小部件的 class。它有两个私人 QString 成员。我希望能够在值更改时使用信号来通知。所以对于这两个变量,我都有一个 setter 和一个 getter。我也有信号

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

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

我可以在连接语句中使用 this - 但就单个信号而言 - 我想两个插槽都会触发?仅选择两个独立信号,然后在 connect 语句中使用 this - 还是我遗漏了什么?

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

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

valueChanged 信号表明 属性 的思维方式有误。假设 invoiceFilterContractorPart 是一些 class Foo:

的 属性
class Foo : public QObject
{
    // ...

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

那么外部对象收到的通知是:

Object foo1 of type Foo says: 'valueChanged'

而不是

invoiceFilterContractorPart says: 'valueChanged'

因此您需要更改信号,以便清楚哪个 属性发生了变化,例如将其重命名为 invoiceFilterContractorPartChanged():

class Foo : public QObject
{
    // ...

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

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

Object foo1 of type Foo says: 'invoiceFilterContractorPartChanged'

这使您能够请求新值,例如 foo1.getInvoiceFilterContractorPart()

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

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

或其他一些 class Bar:

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