Название: 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); }
|