Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Danila_Bagrofff от Декабрь 22, 2009, 09:52



Название: QTimer::sigleShot слот с параметрами
Отправлено: Danila_Bagrofff от Декабрь 22, 2009, 09:52
Есть метод-слот:

Код:
void TTableWidgetDrop::setStateAbonent(uchar numPC, uchar numTLK, char state)
{
switch(state)
{
case ABN_TRANS_COMM:
{
item(numTLK-1, getNumTLKPositionAbn(numPC, numTLK)+1)->setBackground(QBrush(QColor(Qt::green)));

                                          //здесь нужно передать setStateAbonent(numPc, numTLK, -1);
QTimer::singleShot(2000, this, SLOT(setStateAbonent(uchar, uchar, uchar)));
break;
}
case ABN_TRANS_REC:
{

item(numTLK-1, getNumTLKPositionAbn(numPC, numTLK)+1)->setBackground(QBrush(QColor(Qt::cyan)));
         
                                          //здесь нужно передать setStateAbonent(numPc, numTLK, -1);
QTimer::singleShot(2000, this, SLOT(setStateAbonent(uchar, uchar, uchar)));
break;
}
default:
{
item(numTLK-1, getNumTLKPositionAbn(numPC, numTLK)+1)->setBackground(QBrush(QColor(Qt::white)));
break;
}
}
}

По таймеру нужно вызывать тот же слот с теми же входными параметрами. Насколько я понимаю, для singleShot(), как для СЛОТа, указываются только тип параметров... а вот сами данные указать никак нельзя?


Название: Re: Hey what's up?
Отправлено: SABROG от Декабрь 22, 2009, 10:18
Danila_Bagrofff, думаю можно унаследоваться от QEvent и создать свое событие, поместить указатель куда-нибудь в список типа QQueue. По истечении таймера в QTimer::singleShot() извлекать из очереди нужный указатель и отправлять в цикл событий. В методе QObject::event() ловить своё событие, извлекать параметры и вызывать свой метод. При таком способе я бы наверно отказался от QTimer::singleShot() в пользу QObject::startTimer(), а в методе QObject::timerEvent() ставил в очередь событий свои эвенты.


Название: Re: QTimer::sigleShot слот с параметрами
Отправлено: Dendy от Декабрь 22, 2009, 20:22
Такое соединение QTimer::singleShot() вызовет ошибку, поскольку параметры сигнала не проецируются в параметры слота - в слоте их больше и процессор просто не знает откуда их брать. На вопрос - можно ли из взять прямо из вызова, например так: QTimer::singleShot( 2000, this, SLOT(mySlot(1,2,3)) ) ответ - нельзя.


Название: Re: QTimer::sigleShot слот с параметрами
Отправлено: Danila_Bagrofff от Декабрь 23, 2009, 09:21
Денди, ясное дело нельзя =) Вопрос не в этом был =)

В общем, я решил задачу так для себя:

Код:
void TTableWidgetDrop::setStateAbonent(uchar numPC, uchar numTLK, char state)
{
qWarning("setStateAbonent %d, %d, %d", numPC, numTLK, state);
uchar iNumPC = numPC;
uchar iNumTLK = numTLK;
if(numTLK == 0 && numPC == 0 && state == -1)
if(!qStck_abnNumPC.isEmpty() && !qStck_abnNumTLK.isEmpty())
{
qWarning("copy");
iNumPC = qStck_abnNumPC.pop();
iNumTLK = qStck_abnNumTLK.pop();
}

switch(state)
{
case ABN_TRANS_COMM:
{
qWarning("comm %d, %d", numPC, numTLK);
item(numTLK-1, getNumTLKPositionAbn(numPC, numTLK))->setBackground(QBrush(QColor(Qt::green)));

qStck_abnNumPC.push(numPC);
qStck_abnNumTLK.push(numTLK);
QTimer::singleShot(500, this, SLOT(setBaseStateAbonent()));
break;
}
case ABN_TRANS_REC:
{
qWarning("recieve %d, %d", numPC, numTLK);
qStck_abnNumPC.push(numPC);
qStck_abnNumTLK.push(numTLK);
item(numTLK-1, getNumTLKPositionAbn(numPC, numTLK))->setBackground(QBrush(QColor(Qt::cyan)));
QTimer::singleShot(500, this, SLOT(setBaseStateAbonent()));
break;
}
default:
{
if(iNumTLK>0)
{
qWarning("default %d, %d", iNumPC, iNumTLK);
item(iNumTLK-1, getNumTLKPositionAbn(iNumPC, iNumTLK))->setBackground(QBrush(QColor(Qt::white)));
}
break;
}
}
}

void TTableWidgetDrop::setBaseStateAbonent()
{
qWarning("setBaseStateAbonent");
setStateAbonent(0, 0 ,-1);
}