使用QObject :: connect时,我可以将参数传递给槽函数吗?

时间:2013-07-06 11:17:42

标签: qt

Qt4.8.5

 QObject::connect(button,SIGNAL(clicked()),label,SLOT(setText("dd"));

Qt造物主告诉我这是错的。有什么问题?

3 个答案:

答案 0 :(得分:2)

您无法在connect()语句中传递参数。您需要一个“trampoline”插槽来设置标签的文本(或者,在Qt 5中,您可以选择使用lambda)。

例如,通过使用子类:

class MyLabel : public QLabel {
    Q_OBJECT
public slots:
    void setTextToFoo() { setText("foo"); }
};
// ...
connect(button,SIGNAL(clicked()),label,SLOT(setTextToFoo());

答案 1 :(得分:0)

这取决于你想要实现的目标,说实话,你提供的示例代码不是很实用,“dd”是你正在使用的特定静态值,还是可能是其他字符串?它来自何处,是在被调用者的范围内,还是由调用者发送,这是向插槽发送参数时的通常做法。

无论哪种方式,为了使连接语句的第一个要求是匹配的参数,clicked()没有参数而setText()有一个,所以存在不匹配。至于如何解决这种不匹配问题,最简单的方法是使用简单的包装器,尽管你可以使用QSignalMapper和Qt5,lambdas和std :: bind。

对于初学者,你不能在connect语句中指定实际的参数实例,即使双方都有参数,你只需要指定帮助解决重载的类型(Qt5中的新连接语法很糟糕),而不是任何实际的标识符或文字。

如果是更常见的情况,调用者将数据发送到插槽,则在emit signal(value)语句中指定标识符或文字。由于您没有clicked(const QString &),因此您需要一个连接到clicked()的包装器插槽,并使用该包装器插槽中的值进行发送,或者将该按钮子类化并添加您自己的clicked(QString)重载

如果值在被调用的范围内,那么子类化没有多大意义,您需要的只是被调用对象范围内的包装器槽。

如果你想要更多,你将不得不使用Qt 5,其语法功能更强大。

答案 2 :(得分:0)

如果问题是错误的,请记住信号和插槽的参数编号必须相同。询问同事并根据Peppe,setText(QString)等待一个参数,Clicked()为空...自定义插槽是间接调用setText()方法。

你可以看一下:http://qt-project.org/doc/qt-4.8/widgets-calculator.html 它使用QWidget,它是QML旁边Qt接口的重要组成部分。