LINUX.ORG.RU

Qt: проблема со слотами...


0

0

Здравствуйте.
У меня такая проблемка. Приведу листинг программки:

//////////////////
#include <qtimer.h>
#include <qstring.h>
#include <qapplication.h>
#include <qobject.h>

class myMain: public QObject
{
Q_OBJECT

public:
myMain(QString &);
~myMain();

private slots:
void sendRequest(const QString &);
};

myMain::myMain(QString &s)
{
sendRequest(s);
}

myMain::~myMain()
{
}

void myMain::sendRequest(const QString &s)
{
QString str=s+"-Ok";
qWarning(str);
QTimer *t=new QTimer(this);
t->start(5000, TRUE);
connect(t ,SIGNAL(timeout()), this, SLOT(sendRequest( str )) );
}

int main(int argc, char **argv)
{
QApplication app( argc, argv );
QString a("Test");
myMain m_main(a);
return app.exec();
}
#include "main.moc"
/////////////////

После компиляции запускаю:
%./test

test-Ok
QObject::connect: No such slot myMain::sendRequest(str)
QObject::connect: (sender name: 'unnamed')
QObject::connect: (receiver name: 'unnamed')


Так вот что у меня вопрос: что ей здесь не нравится?
И еще один: если так нельзя, то каким образом можно после истечения таймера( SIGNAL(timeout()) ) вызвать слот sendRequest() с теми параметрами какие я хочу, например, sendRequest("sendRequest called!!!")?

Так делать нельзя во первых коннектиь сигнал можно только к слоту того же типа а не переодвать переменную, а вобще нужно было сделать так

1) объявить в классе сигнал my_signal(const QString& ref)
2) приконнектить его куда нужно (слот тоже должен быть const QString& ref )
3) создать таймер startTimer( 5000 )
4) Перекрыть в классе обработчик timerEvent и нем emit my_signal


anonymous
()

возможно также, что пробема изза объявления слота приватным. сделай public, должно полегчать

Vinill ★★
()
Ответ на: комментарий от Vinill

2Vinill:
анонимус прав.....:

Вот вырезка из доки по Qt (bool QObject::connect()):
...
Note that the signal and slots parameters must not contain any variable names, only the type. E.g. the following would not work and return FALSE: QObject::connect( scroll, SIGNAL(valueChanged(int v)), label, SLOT(setNum(int v)) );
...

IPFreely ★★
() автор топика


Вдогонку:

SLOT(sendRequest( str )) // <-- вместо str надо const QString&

QTimer *t=new QTimer(this); // Не проще ли было просто вызвать QObject::startTimer ( int interval ) ?
t->start(5000, TRUE); //

connect(t ,SIGNAL(timeout()), this, SLOT(sendRequest( str )) );
слишком многословно. Лучше так:
connect(t ,SIGNAL(timeout()), SLOT(sendRequest()) );

ANDI ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.