2013-07-01 68 views
0

我想在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; 
} 
+0

刪除一個對象本身?這是沒有意義的(除非你有回叫來警告其他用戶對象),在你使用類的實例來解決問題的地方使用超時。超時後更新屏幕。 –

+0

張貼的源代碼似乎並沒有顯示出問題,你有。您應該在事件過濾器中創建一個「簡短,自包含,正確(可編譯),示例」http://sscce.org/ – bjoernz

+0

處理關鍵事件? **不好!! **有大量的處理程序可用。順便說一句關於定時器的代碼(連接,DeleteClass) – UmNyobe

回答

0

您可以使用QTimer定期運行檢查和QElapsedTimer計算不活動時間。

在標題:

QElapsedTimer elapsed_timer; 

在初始化:

elapsed_timer.start(); 
QTimer* timer = new QTimer(this); 
connect(timer, SIGNAL(timeout()), this, SLOT(timeout())); 
timer->start(1000); // number of milliseconds between checks 
// install event filter for target widget, etc. 

timeout槽:

if (elapsed_timer.elapsed() > 15000) { // timeout interval in msec 
    //perform close actions, e.g. widget->close() 
} 

在事件過濾器:下面的代碼應如果被執行收到適當的重要事件:

elapsed_timer.restart(); 
+0

不幸的是,我的QT不支持QElapsedTimer,所以有沒有其他方式來計算不活動時間 – user1400571

+0

我曾經遇到同樣的問題。你可以使用我的實現。參見'Elapsed_timer'類[這裏](https://github.com/Riateche/ridual/tree/master/src)。使用'restart'替代'start'。實現非常簡單。 –

+0

非常感謝你.... – user1400571