Russian Qt Forum
Ноябрь 26, 2024, 16:37 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTimer::sigleShot слот с параметрами  (Прочитано 6586 раз)
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(), как для СЛОТа, указываются только тип параметров... а вот сами данные указать никак нельзя?
« Последнее редактирование: Декабрь 22, 2009, 09:55 от Danila_Bagrofff » Записан
SABROG
Гость
« Ответ #1 : Декабрь 22, 2009, 10:18 »

Danila_Bagrofff, думаю можно унаследоваться от QEvent и создать свое событие, поместить указатель куда-нибудь в список типа QQueue. По истечении таймера в QTimer::singleShot() извлекать из очереди нужный указатель и отправлять в цикл событий. В методе QObject::event() ловить своё событие, извлекать параметры и вызывать свой метод. При таком способе я бы наверно отказался от QTimer::singleShot() в пользу QObject::startTimer(), а в методе QObject::timerEvent() ставил в очередь событий свои эвенты.
« Последнее редактирование: Декабрь 22, 2009, 15:05 от Sergeich » Записан
Dendy
Гость
« Ответ #2 : Декабрь 22, 2009, 20:22 »

Такое соединение QTimer::singleShot() вызовет ошибку, поскольку параметры сигнала не проецируются в параметры слота - в слоте их больше и процессор просто не знает откуда их брать. На вопрос - можно ли из взять прямо из вызова, например так: QTimer::singleShot( 2000, this, SLOT(mySlot(1,2,3)) ) ответ - нельзя.
Записан
Danila_Bagrofff
Гость
« Ответ #3 : Декабрь 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);
}
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.068 секунд. Запросов: 20.