On Wednesday 17 June 2009, Andrey D. wrote:
| slots ‘action()’
|# gui section
|
|window.show()
|app.exec()
|
| When I launch it I get the message:
|
|Object::connect: No such slot RDPSelect::action(item)
|
| Thanks in advance,
| Andrey
The reason is that, both in the call to slots and in the call to
connect, you
specify the slot in the wrong name. The correct way to specify a slot
(or a
signal) is to use its signature, which is made of:
- the slot’s name
- a list of the class of the slot’s arguments enclosed in brackets.
In your call to slots you specify no argument, so when Qt tries to find
a slot
called action which takes one argument, it fails.
The way you specify the slot in the call to connect is wrong for a
similar
reason: this time, you do specify an argument for the slot, but you use
the
name of the variable, instead of its class.
To make your code work, you need to make two changes:
- replace the call to slots with
slots ‘action(QListWidgetItem*)’
- replace the call to connect with
Qt::Object.connect(list, SIGNAL(‘itemActivated(QListWidgetItem*)’),
list, SLOT(‘action(QListWidgetItem*)’))
What I stated above is completely true when speaking of Qt in C++. In
ruby,
things can be a little different. In particular, in ruby, as far as
signals
and slots are concerned, Qt knows nothing about methods, but only cares
of
what we declare using the signals ands slots methods. This means, for
example,
that we can do something like this:
class C < Qt::Objec
slots ‘slot1(QString)’
def slot1(a, b = ‘’, c = 3)
…
end
end
Here, I declared a slot with a single argument, but defined the
associated
method as taking three arguments (with the last two optional). I can
make a
connection which calls slot1 with one argument, (but not with two or
three,
since the slot’s signature only have one argument), but I can call it by
hand
with one, two or three arguments.
I hope this helps
Stefano