【问题标题】:Catch ESC key press event when editing a QTreeWidgetItem编辑 QTreeWidgetItem 时捕获 ESC 按键事件
【发布时间】:2013-01-26 14:52:05
【问题描述】:

我正在用 Qt 开发一个项目。我有一个 QTreeWidget(filesTreeWidget) 带有一些文件名和一个用于创建文件的按钮。 Create 按钮向 filesTreeWidget 添加一个新项目(项目的文本是“”),该项目被编辑以选择名称。当我按 ENTER 时,文件名通过套接字发送到服务器。当我按 ESC 时出现问题,因为文件名仍然是“”并且没有发送到服务器。我试图覆盖 keyPressEvent 但不工作。有任何想法吗?我需要在编辑项目时捕捉 ESC 按下事件。

【问题讨论】:

    标签: c++ qt networking event-handling key


    【解决方案1】:

    您可以继承 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
        }
    }
    

    可能有更优雅的方法来实现你想要的,但这应该很容易。例如,如果你真的不想子类化,你可以安装一个事件过滤器,但我不喜欢这样做,特别是对于有很多事件的“大”类,因为它相对昂贵。

    【讨论】:

    • 我在询问之前做了这个,但是当我按下 ESC 键时,不会调用 keyPressEvent() 方法,就像没有按键事件一样。
    【解决方案2】:

    实现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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-28
      • 1970-01-01
      • 1970-01-01
      • 2016-09-25
      • 2014-09-27
      • 2011-09-19
      • 1970-01-01
      相关资源
      最近更新 更多