当编辑QTreeWidgetItem时如何捕获ESC按键事件

4
我正在使用Qt开发一个项目。我有一个QTreeWidget(filesTreeWidget),其中包含一些文件名和一个用于创建文件的按钮。单击“Create”按钮会向filesTreeWidget添加一个新项(该项的文本为“”),并可编辑以选择名称。当我按下ENTER键时,文件名通过套接字发送到服务器。问题是当我按下ESC键时,文件名仍然为空,并且未被发送到服务器。我尝试重写keyPressEvent,但不起作用。有什么想法吗?我需要在编辑项时捕获ESC按键事件。
2个回答

8
你可以继承 QTreeWidget 类,并重新实现 QTreeView::keyPressEvent 方法,示例代码如下:
void MyTreeWidget::keyPressEvent(QKeyEvent *event)
{
    if (event->key() == Qt::Key_Escape)
    {
        // handle the key press, perhaps giving the item text a default value
        event->accept();
    }
    else
    {
        QTreeView::keyPressEvent(event); // call the default implementation
    }
}

实现你想要的功能可能有更加优雅的方式,但是这种方法应该会比较简单。例如,如果你真的不想使用子类,你可以安装一个事件过滤器,但我不喜欢在具有大量事件的“大”类中执行此操作,因为它相对比较昂贵。


2
我在提问之前就已经做了这个,但是当我按下 ESC 键时,keyPressEvent() 方法没有被调用,就好像没有键盘按下事件一样。 - John Smith

4

请按照以下方式实现keyPressEvent函数:

void TestTreeWidget::keyPressEvent(QKeyEvent *event)
{
    switch (event->key())
    {
        case Qt::Key_Escape:
        {
            escapeKeyPressEventHandler(); 
            event->accept();
            break;
        }
        default:
            QTreeWidget::keyPressEvent(event);
    }
}

TestTreeWidget::escapeKeyPressEventHandler()
{
     // work with your QTreeWidgetItem here
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接