Qt问题将参数传递给slot

时间:2010-11-11 23:32:39

标签: c++ qt qt4 signals-slots

我似乎无法将一个参数传递给一个插槽。如果我没有传递一个参数,那么函数会很好地通过。如果我传递一个参数(整数),我编译时会得到错误“没有这样的名字类型”和“没有这样的插槽”。

在我的标题中,我声明:

private slots:
void addButton(int);
signals:
void clicked(int)

在我的Main.cpp中,我这样做:

int count;
int count = 0;
QPushButton* button = new QPushButton("Button");
_layout->addWidget(button);
connect(button, SIGNAL(clicked(count), this, SLOT(addButton(count)));

...

void Main::addButton(int count) {

//do stuff with count

}

3 个答案:

答案 0 :(得分:17)

塞巴斯蒂安是正确的,你不能按照你尝试的方式做到这一点,但是Qt确实提供了一个为你提供所需功能的课程。

查看QSignalMapper。它允许您将整数与对象/信号对相关联。然后,您可以连接到信号,而不是直接连接到按钮。

答案 1 :(得分:8)

信号和插槽必须具有相同数量和类型的参数,并且您只能将信号的参数传递给插槽,而不是您想要的任何变量或值。

答案 2 :(得分:3)

我可以看到三个问题。

首先,clicked()信号由QPushButton发出(没有参数),但您尝试在自己的类中重新定义它(带有int参数)。如果你想这样做:

SignalClass* objectWithSignals = new SignalClass;
SlotClass* objectWithSlots = new SlotClass;
connect(objectWithSignals, SIGNAL(a()), objectWithSlots, SLOT(b()));

然后您只能连接到SignalClass中已定义的信号。换句话说,信号a()必须属于SignalClass,而不是SlotClass

(事实上,clicked()QPushButton的基类QAbstractButton中定义。)

其次,在connect()函数中,您需要使用参数类型指定信号和插槽签名。如果count函数中有connect(),则应为int

第三,您的连接通话中缺少一个括号:SIGNAL(clicked(count))

希望有所帮助。