0

我正在尝试在 QT 中实现超时。我想执行以下任务,所以我需要超时。在应用程序中,我实现了菜单。如果我从菜单中选择选项,它将执行相关屏幕。如果我在 15 秒之前没有收到任何关键事件,则此屏幕应在 15 秒后超时。以下是我的代码:

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, this, SLOT(DeleteClass())); 但它不工作。请帮助我解决这个问题。我在上面的代码中的 if(event->type() == QEvent::KeyPress) 语句中实现了 QTimer::singleShot,这样每当我按下一个键时,它都会重新初始化 QTimer::singleShot 和屏幕cMeasurementUnit 类的不会超时,否则会在 15 秒后超时。以下是 DeleteClass 的代码,是否正确?如果不是,请告诉我正确的方法吗?提前致谢

void cMeasurementUnit::DeleteClass()
{
    DPRINTF("IN FUNCTION %s\n",__FUNCTION__);
    delete this;
}
4

1 回答 1

2

您可以使用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();
于 2013-07-01T08:30:44.360 回答