我似乎无法将一个参数传递给一个插槽。如果我没有传递一个参数,那么函数会很好地通过。如果我传递一个参数(整数),我编译时会得到错误“没有这样的名字类型”和“没有这样的插槽”。
在我的标题中,我声明:
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
}
答案 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))
。
希望有所帮助。