c++ - 按键事件及其重载

标签 c++ qt oop

我有一个处理转义键按下的类。

         class KeyPress : public QWidget
       {
           Q_OBJECT
          public:
            KeyPress(QWidget * parent=0);

          protected:
             void keyPressEvent(QKeyEvent * event);

       };

和 .cpp 文件:

          void KeyPress::keyPressEvent(QKeyEvent *event)
           {

                if (event->key() == Qt::Key_Escape) {
                    qApp->quit();
                           }
            }

它工作正常,但如果我更改方法的名称,比如 keyPressed(QKeyEvent * event),它就不起作用。根据文档,keyPressEvent(QKeyEvent * event) 方法是 QWidget 的 protected 方法。 所以初始代码只是重载了那个方法,不是吗?并且过载有效。但是,为什么具有不同名称但实现相同的方法的全新版本不起作用?

最佳答案

不是overload , 它是 overridevirtual功能。 了解 c++ virtual功能。

例如:

#include <iostream>

using std::cout;
struct Foo { /*virtual*/void f() { cout << "foo:f\n"; } };
struct Boo : public Foo { void f() { cout << "boo:f\n"; } };

int main()
{
    Boo boo;
    Foo *ptr = &boo;
    ptr->f();
}

这样的代码打印foo:f , 因为 ptr->f()编译器生成如下内容:

address_of_function = &Foo::f;
call address_of_function

但是如果你取消注释 virtual在我的示例代码中将打印 boo:f , 因为virtual导致编译器生成类似这样的代码:

 address_of_function = ptr->virtual_table_of_Foo_class[offset_of_f]
 call address_of_function

ptr指向 Boo 类虚表,address_of_function将等于 &Boo::f ,这如何virtual功能有效。

所以在你的情况下Foo == QWidgetQt 中有这样的代码:

this->keyPressEvent();

,地址为 keyPressEvent在虚拟表中,并调用它。显然,如果你实现 KeyPress::someOtherFunction , 它不会被调用,因为已经编译了 Qt 的代码没有调用它。

关于c++ - 按键事件及其重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36960458/

相关文章:

c++ - 在QTabBar中选择标签文本

c++ - 在 QWidget 之间切换

c++ - QSystemTrayIcon 不显示

php - 为什么 PHP 不允许私有(private) const?

c - 使用 C 语言进行数据封装的 OOP 编程

java - 书籍对象的 boolean 值

c++ - 异步 winsock 服务器包装器,CPU 滞后 - C++

c++ - c++中一个dll的多个实例

c++ - WXWidgets TextCtrl 或 RichTextCtrl

Qt Quick Controls 2 和 TableView