将 Q_PROPERTY 与 NOTIFY 项一起用于 QString
using Q_PROPERTY with a NOTIFY item for a QString
我有一个基于小部件的 class。它有两个私人 QString
成员。我希望能够在值更改时使用信号来通知。所以对于这两个变量,我都有一个 setter 和一个 getter。我也有信号
- 问:他们可以使用同一个信号吗?还是我必须定义两个独立的信号?
然后 - 我想将该信号绑定到同一 class 中的一个插槽(我知道我可以调用该插槽而不是发出信号 - 但我想使用信号)。
如何连接它们?我试过了:
connect( &invoiceFilterDirectionPart, SIGNAL(valueChanged(QString)), this, SLOT(invoiceFilterDirectionPart_valueChanged(QString)) );
但它无法编译 - 因为 invoiceFilterDirectionPart
是 QString
,而 connect
期望第一个参数是 QObject*
我可以在连接语句中使用 this
- 但就单个信号而言 - 我想两个插槽都会触发?仅选择两个独立信号,然后在 connect
语句中使用 this
- 还是我遗漏了什么?
最后一个问题:我需要 Q_PROPERTY
才能完成所有这些工作吗?当我第一次使用它时,我认为它是某种神奇的宏 - 当我使用它时,就像这样:
Q_PROPERTY(QString invoiceFilterContractorPart
READ getInvoiceFilterContractorPart
WRITE setInvoiceFilterContractorPart
NOTIFY valueChanged
)
我认为它会自动神奇地生成变量、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)));
我有一个基于小部件的 class。它有两个私人 QString
成员。我希望能够在值更改时使用信号来通知。所以对于这两个变量,我都有一个 setter 和一个 getter。我也有信号
- 问:他们可以使用同一个信号吗?还是我必须定义两个独立的信号?
然后 - 我想将该信号绑定到同一 class 中的一个插槽(我知道我可以调用该插槽而不是发出信号 - 但我想使用信号)。
如何连接它们?我试过了:
connect( &invoiceFilterDirectionPart, SIGNAL(valueChanged(QString)), this, SLOT(invoiceFilterDirectionPart_valueChanged(QString)) );
但它无法编译 - 因为 invoiceFilterDirectionPart
是 QString
,而 connect
期望第一个参数是 QObject*
我可以在连接语句中使用 this
- 但就单个信号而言 - 我想两个插槽都会触发?仅选择两个独立信号,然后在 connect
语句中使用 this
- 还是我遗漏了什么?
最后一个问题:我需要
Q_PROPERTY
才能完成所有这些工作吗?当我第一次使用它时,我认为它是某种神奇的宏 - 当我使用它时,就像这样:Q_PROPERTY(QString invoiceFilterContractorPart READ getInvoiceFilterContractorPart WRITE setInvoiceFilterContractorPart NOTIFY valueChanged )
我认为它会自动神奇地生成变量、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)));