Qt 将Q_属性与QString的通知项一起使用

Qt 将Q_属性与QString的通知项一起使用,qt,signals-slots,qproperty,Qt,Signals Slots,Qproperty,我有一个基于widget的类。它有两个私有QString成员。我希望能够使用信号来通知值何时更改。所以对于这两个变量,我都有一个setter和一个getter。我还有一个信号 问题:它们能使用相同的信号吗?还是我必须定义两个独立的信号 然后-我想将该信号绑定到同一类中的一个插槽(我知道我可以调用插槽而不是发出信号-但我想使用信号) 如何连接它们?我试过: connect( &invoiceFilterDirectionPart, SIGNAL(valueChanged(QStrin

我有一个基于widget的类。它有两个私有
QString
成员。我希望能够使用信号来通知值何时更改。所以对于这两个变量,我都有一个setter和一个getter。我还有一个信号

  • 问题:它们能使用相同的信号吗?还是我必须定义两个独立的信号
然后-我想将该信号绑定到同一类中的一个插槽(我知道我可以调用插槽而不是发出信号-但我想使用信号)

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

    connect( &invoiceFilterDirectionPart, SIGNAL(valueChanged(QString)), this, SLOT(invoiceFilterDirectionPart_valueChanged(QString)) );
    
但它不会编译-因为
invoicefilterddirectionpart
QString
,而
connect
希望第一个参数是
QObject*

我可以在connect语句中使用
这个
,但就单个信号而言,我想两个插槽都会触发?只有选项两个独立的信号,然后在
connect
语句中使用
this
——还是我遗漏了什么

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

    Q_PROPERTY(QString invoiceFilterContractorPart 
        READ getInvoiceFilterContractorPart
        WRITE setInvoiceFilterContractorPart
        NOTIFY valueChanged
    )
    

我认为它会神奇地自动生成变量、setter、getter和通知器信号。可悲的是,这并没有发生;)。它只是尖叫着说上面提到的东西都不存在。就这些吗?无法为它找到一个好的用例…

据我所知,您不一定需要设置
Q\u属性
,但由于
invoiceFilterContractorPart
似乎是您对象的属性,因此它的使用是正确的。别管了

更改了
信号表示对属性的思考方式错误。假设
invoiceFilterContractorPart
是某个类的属性
Foo

class Foo : public QObject
{
    // ...

    Q_PROPERTY(QString invoiceFilterContractorPart 
        READ getInvoiceFilterContractorPart
        WRITE setInvoiceFilterContractorPart
        NOTIFY valueChanged
    )
}
那么外部对象得到的通知是:

类型为Foo的对象foo1表示:“valueChanged”

而不是

invoiceFilterContractorPart说:“值已更改”

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

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

类型为Foo的对象foo1表示:“invoiceFilterContractorPartChanged”

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

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

connect(this, SIGNAL(invoiceFilterDirectionPartChanged(QString)),
        someotherobject, SLOT(onFooDidInvoiceFilterDirectionPartChanged(QString)));
或者在其他类别的
条中:

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

我有一种感觉,结果会是这样;)谢谢确认!
connect(&foo1, SIGNAL(invoiceFilterDirectionPartChanged(QString)),
        this, SLOT(onFooDidInvoiceFilterDirectionPartChanged(QString)));