Qt - 信号槽中的参数

4

我有一个QPushButton、QDateEdit和另一个自定义对象。我想要将按钮与日期编辑对象连接起来,当我单击按钮时,日期编辑对象会按照自定义对象上定义的日期更改其设置日期。类似这样:

connect(pushbutton,SIGNAL(clicked()),dateedit,SLOT(setDate(custom_object.getDate())));

但是我不能这样做。显然,连接语句没有指定从信号传递到插槽的信息是什么,只指定了传递的信息类型。是否有一种方法可以在不创建新类的情况下完成此操作?

1个回答

5

通常最简单的方法是创建一个包含该功能的包装函数。换句话说:

connect(pushbutton, SIGNAL(clicked()), SLOT(setDateFromCustomObject()));

接下来,在调用connect的同一个类中:

void YourClass::setDateFromCustomObject() {
  dateEdit->setDate(custom_object.getDate());
}

通过使用名为Qxt的外部库,可以使用特定参数和对象进行连接时间绑定。它的文档似乎不完整或过时,但它确实提供了一些很好的功能。我认为这仅适用于高级用户。


1
为什么Qt不支持本地化?似乎比因为插槽而创建全新的类更简单。 - liewl
1
@bullettime:这违反了信号/槽的松耦合原则。实现你想要的最好的方法是创建一个子类。 - Adam W
1
你不需要创建另一个类。很可能你已经有一个类知道pushbutton和dateedit。理想情况下是使用lambda函数,但我们没有这个选项。 - Kaleb Pederson
2
@Adam W - 实际上,我认为添加运行时绑定支持没有任何问题,也不知道它会如何影响耦合。消息传递架构不会改变,而是Qt将简单地获得一些数据注入支持。另一方面,它混淆了连接发送者和接收者以及数据绑定的概念。这也会使调试变得更加复杂。尽管如此,如果可用,我绝对会使用它。在一行中,connect调用,我会准确地知道正在绑定和注入什么。 - Kaleb Pederson
1
@Kaleb:我同意在连接时进行注入,但是你的示例有一个类从成员(pushbutton)接收信号,然后借助第三个成员(custom_object)在另一个成员(dateEdit)中设置值。理想情况下,第三个成员(custom_object)将是dateEdit子类的成员,这样您就可以调用该成员上的插槽来设置日期。这样每个类都可以独立地完成其所需的任务。 - Adam W
正确。虽然您不必创建一个类,但通过子类化以更好地按职责分组可能会更好的设计 - 理想情况下遵循单一职责原则。由于我不完全知道 custom_object 做什么,因此我不敢在这种情况下假设哪个更好。总体而言,这些都是很好的考虑因素。 - Kaleb Pederson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接