我想在QT中實現超時。我想執行以下任務,因此我需要超時。 在應用程序中我已經實現了菜單。如果我從菜單中選擇了選項,它將執行相關屏幕。如果我在15秒之前沒有收到任何按鍵事件,此屏幕應在15秒後超時。以下是我的代碼:在QT中實現超時
bool cMeasurementUnit::eventFilter(QObject *obj, QEvent *event)
{
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
if(event->type() == QEvent::KeyPress)
{
if((keyEvent ->key()) == Qt::Key_Tab)
{
if(m_pWidgetFirstTabFocus->hasFocus())
{
m_pWidgetFirstTabFocus->setStyleSheet(QString::fromUtf8("background-color: rgb(255, 255, 255);"));
}
m_pWidgetFirstTabFocus = m_pWidgetFirstTabFocus->nextInFocusChain() ;
while((m_pWidgetFirstTabFocus->focusPolicy()) == Qt::NoFocus)
{
m_pWidgetFirstTabFocus = m_pWidgetFirstTabFocus->nextInFocusChain() ;
if(m_pWidgetFirstTabFocus == this)
{
m_pWidgetFirstTabFocus = MEASUREMENT_UNIT_FIRST_TAB;
}
}
m_pWidgetFirstTabFocus->setStyleSheet(QString::fromUtf8("background-color: rgb(207, 207, 207);"));
}
else if((keyEvent ->key()) == Qt::Key_Return)
{
SaveChannelUnit();
return true ;
}
else if((keyEvent ->key()) == Qt::Key_Up)
{
if (((QComboBox *)m_pWidgetFirstTabFocus)->currentIndex() == 0)
{
((QComboBox *)m_pWidgetFirstTabFocus)->setCurrentIndex((((QComboBox *)m_pWidgetFirstTabFocus)->count() - 1)) ;
return true ;
}
}
else if((keyEvent ->key()) == Qt::Key_Left)
{
return true;
}
}
return QObject::eventFilter(obj, event);
}
我曾嘗試使用QTimer :: singleShot實施(15000,對此,SLOT(DeleteClass())); 但它不工作。請幫我解決這個問題。我已經在上面的代碼中實現了QTimer :: singleShot if(event-> type()== QEvent :: KeyPress)語句,這樣每當我按下一個鍵時,它將重新初始化QTimer :: singleShot和screen cMeasurementUnit類不會超時,否則會在15秒後超時。以下是DeleteClass的代碼,是否正確?如果不是,請你告訴我正確的做法嗎?在此先感謝
void cMeasurementUnit::DeleteClass()
{
DPRINTF("IN FUNCTION %s\n",__FUNCTION__);
delete this;
}
刪除一個對象本身?這是沒有意義的(除非你有回叫來警告其他用戶對象),在你使用類的實例來解決問題的地方使用超時。超時後更新屏幕。 –
張貼的源代碼似乎並沒有顯示出問題,你有。您應該在事件過濾器中創建一個「簡短,自包含,正確(可編譯),示例」http://sscce.org/ – bjoernz
處理關鍵事件? **不好!! **有大量的處理程序可用。順便說一句關於定時器的代碼(連接,DeleteClass) – UmNyobe