2

Qt4.8.5

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

Qt Creator 告诉我这是错误的。有什么问题 ?

4

3 回答 3

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());
于 2013-07-06T11:24:43.053 回答
0

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

无论哪种方式,为了制作一个连接语句,第一个要求是参数匹配,clicked()没有参数而setText()有一个,因此存在不匹配。至于如何解决这种不匹配,最简单的方法是使用简单的包装器,尽管您可以使用QSignalMapperQt5 中的 a 和 as、lambdas 和 std::bind。

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

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

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

如果你想要更多,你将不得不使用 Qt 5,它的语法明显更强大。

于 2013-07-06T12:12:37.667 回答
0

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

您可以查看:http: //qt-project.org/doc/qt-4.8/widgets-calculator.html 它使用 QWidget,这是 QML 之外 Qt 接口的重要组成部分。

于 2014-04-04T13:46:09.063 回答