Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt键按事件,";持有;,以及按键/鼠标点击的按键释放事件处理_Qt_Qpushbutton_Qevent - Fatal编程技术网

Qt键按事件,";持有;,以及按键/鼠标点击的按键释放事件处理

Qt键按事件,";持有;,以及按键/鼠标点击的按键释放事件处理,qt,qpushbutton,qevent,Qt,Qpushbutton,Qevent,我正在编写一个Qt程序来模拟一个硬件,我想模拟按钮按下、保持和释放事件。在我的应用程序中,我希望处理来自键盘和鼠标点击的输入,以方便用户(即我)。我注意到一些奇怪的行为,我不明白 应用程序使用QPushButton,启用了autoRepeat,并使用了100毫秒autoRepeatDelay和autoRepeatInterval。如果我用鼠标点击按钮,我会收到交替的“按下”和“释放”事件。我本以为会看到1到N-1个“按下”事件,然后是一个“释放”事件。为什么Qt会这样 我还实现了以下代码来处理来

我正在编写一个Qt程序来模拟一个硬件,我想模拟按钮按下、保持和释放事件。在我的应用程序中,我希望处理来自键盘和鼠标点击的输入,以方便用户(即我)。我注意到一些奇怪的行为,我不明白

应用程序使用QPushButton,启用了
autoRepeat
,并使用了100毫秒
autoRepeatDelay
autoRepeatInterval
。如果我用鼠标点击按钮,我会收到交替的“按下”和“释放”事件。我本以为会看到1到N-1个“按下”事件,然后是一个“释放”事件。为什么Qt会这样

我还实现了以下代码来处理来自键盘的按键操作:

void MyApp::keyPressEvent(QKeyEvent *event)
{
    QString s = QString("My PRESS key is %1. The counter is %2").arg(event->text(), QString::number(keyCounter));
    qDebug() << s;
    keyCounter++;
}

void MyApp::keyReleaseEvent(QKeyEvent *event)
{
    QString s = QString("My RELEASE key is %1. The counter is %2").arg(event->text(), QString::number(keyCounter));
    qDebug() << s;
    keyCounter = 0;
}

bool MyApp::eventFilter(QObject *obj, QEvent *event)
{
    if (event->type() == QEvent::KeyPress)
    {
        this->keyPressEvent(dynamic_cast<QKeyEvent*>(event));
        return true;
    }
    else if (event->type() == QEvent::KeyRelease)
    {
        this->keyReleaseEvent(dynamic_cast<QKeyEvent*>(event));
        return  true;
    }
    else
    {
        return QObject::eventFilter(obj, event);
    }
}
void MyApp::keyPressEvent(QKeyEvent*event)
{
QString s=QString(“我的按键是%1。计数器是%2”).arg(事件->文本(),QString::number(键计数器));
qDebug()text(),QString::number(keyCounter));
qDebug()类型()==QEvent::KeyPress)
{
此->按键事件(动态施法(事件));
返回true;
}
else if(事件->类型()==QEvent::KeyRelease)
{
此->按键释放事件(动态施法(事件));
返回true;
}
其他的
{
返回QObject::eventFilter(对象,事件);
}
}
这里我看到两种行为。对于字母数字键,我看到交替的“按下”和“释放”事件。对于箭头键,我只看到“已发布”事件。同样,我希望看到1到N-1个“按下”事件,然后是一个“释放”事件。为什么箭头键的行为与字母数字键不同


我试图在Qt中实现的是吗?

我的解决方案是:首先,我禁用了
autoRepeat
,并停止处理
keyPressEvents
,因为我发现箭头键没有生成它们。相反,我注册了我想要使用的键盘按钮的快捷键:

QShortcut *shortcutUp = new QShortcut(QKeySequence("Up"), this);
QObject::connect(shortcutUp, SIGNAL(activated()), this, SLOT(on_upButton_pressed()));
shortcutUp->setAutoRepeat(false);
然后在
on\u upButton\u pressed()
函数(例如)中,我设置了一个标志,指示按钮被按下。此标志在打开按钮释放()时清除。函数中。以100毫秒的间隔检查该标志(使用QTimer)。如果该标志为true,我将再次在按下按钮()时调用
。这意味着:

  • 每次鼠标单击或键盘按钮按下都会生成一个“按下”事件
  • “按下”事件设置由QTimer检查的标志
  • 如果标志为
    true
    ,则会生成另一个“按下”事件
  • 释放鼠标或键盘按钮时,将生成“释放”事件并清除标志

它正在工作

这是由QT generate auto repeat事件中的一些键引起的:

这里我看到两种行为。对于字母数字键,我看到 交替“按下”和“释放”事件。对于箭头键,我仅 请参阅“已发布”事件。再说一次,我本以为会看到1比1 N-1个“按下”事件,然后是“释放”事件。为什么箭会飞 键的行为与字母数字键不同

在QT5中,您可以通过
QKeyEvent
对象的函数
isAutoRepeat()
检测按下的键。如果按住键,则
isAutoRepeat()
将返回
true
。例如:

void MainWindow::keyPressEvent(QKeyEvent *event)
{
    if (event->isAutoRepeat())
    {
        return;
    }

    if (!event->isAutoRepeat())
    {
        qDebug() << "[MainWindow::keyPressEvent()] " << event->key() << "; " << event->isAutoRepeat();
    }
}

void MainWindow::keyReleaseEvent(QKeyEvent *event)
{
    if (event->isAutoRepeat())
    {
        return;
    }
    qDebug() << "[MainWindow::keyReleaseEvent()] " << event->key() << "; " << event->isAutoRepeat();
}
void主窗口::按键事件(QKeyEvent*event)
{
如果(事件->isAutoRepeat())
{
返回;
}
如果(!事件->isAutoRepeat())
{

qDebug()“如果启用了自动恢复功能,则当按钮按下时,会定期发出按下()、释放()和单击()的信号。”起初我没有完全摸索这看起来是重复事件的来源。我必须自己生成解决方案。你期望的行为看起来和Windows API相当。但是X11GUI工作得很好……关于WayLand。我猜QT模拟了一致的行为。