我有一个处理转义键按下的类。
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
, 它是 override
的 virtual
功能。
了解 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
== QWidget
在 Qt
中有这样的代码:
this->keyPressEvent();
,地址为 keyPressEvent
在虚拟表中,并调用它。显然,如果你实现 KeyPress::someOtherFunction
, 它不会被调用,因为已经编译了 Qt
的代码没有调用它。
关于c++ - 按键事件及其重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36960458/