Qt4.8.5
QObject::connect(button,SIGNAL(clicked()),label,SLOT(setText("dd"));
Qt Creator 告诉我这是错误的。有什么问题 ?
Qt4.8.5
QObject::connect(button,SIGNAL(clicked()),label,SLOT(setText("dd"));
Qt Creator 告诉我这是错误的。有什么问题 ?
你不能在connect()
声明中传递参数。您需要一个设置标签文本的“trampoline”插槽(或者,在 Qt 5 中,您可能会选择使用 lambda)。
例如,通过使用子类:
class MyLabel : public QLabel {
Q_OBJECT
public slots:
void setTextToFoo() { setText("foo"); }
};
// ...
connect(button,SIGNAL(clicked()),label,SLOT(setTextToFoo());
这取决于您到底想要实现什么,老实说,您提供的示例代码不是很实用,“dd”是您正在使用的特定静态值,还是可能是其他字符串?它来自哪里,是在被调用的范围内,还是由调用者发送的,这是向槽发送参数时的通常做法。
无论哪种方式,为了制作一个连接语句,第一个要求是参数匹配,clicked()
没有参数而setText()
有一个,因此存在不匹配。至于如何解决这种不匹配,最简单的方法是使用简单的包装器,尽管您可以使用QSignalMapper
Qt5 中的 a 和 as、lambdas 和 std::bind。
对于初学者,你不能在连接语句中指定实际的参数实例,即使两边都有参数,你只需要指定类型来帮助解决重载(Qt5 中的新连接语法很糟糕),而不是任何实际的标识符或文字。
在更常见的情况下,数据由调用者发送到插槽,标识符或文字在emit signal(value)
语句中指定。由于您没有clicked(const QString &)
您需要一个包装器插槽,您需要连接到该包装器插槽clicked()
并使用该包装器插槽中的值发出,或者子类化按钮并添加您自己的clicked(QString)
.
如果值在被调用的范围内,那么子类化没有多大意义,您所需要的只是被调用对象范围内的包装槽。
如果你想要更多,你将不得不使用 Qt 5,它的语法明显更强大。
如果问题是什么问题,请记住 Signal 和 Slot 的参数编号必须相同。询问同事,根据Peppe,setText(QString) 等待一个参数,Clicked() 为空...自定义槽是间接调用setText() 方法。
您可以查看:http: //qt-project.org/doc/qt-4.8/widgets-calculator.html 它使用 QWidget,这是 QML 之外 Qt 接口的重要组成部分。