1

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

  • 问题:它们可以使用相同的信号吗?还是我必须定义两个独立的信号?

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

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

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

但它不会编译 - 就像invoiceFilterDirectionParta一样QString,而connect期望第一个参数是QObject*

我可以this在连接语句中使用——但就单个信号而言——我猜这两个插槽都会触发?只有选项两个独立的信号,然后thisconnect语句中使用 - 还是我错过了什么?

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

    Q_PROPERTY(QString invoiceFilterContractorPart 
        READ getInvoiceFilterContractorPart
        WRITE setInvoiceFilterContractorPart
        NOTIFY valueChanged
    )
    

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

4

1 回答 1

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)));
于 2015-03-31T20:33:02.120 回答