我有一个这样的QWidget派生类:
class tetris_canvas : public QWidget
{
Q_OBJECT
public:
tetris_canvas(QWidget * parent = 0);
~tetris_canvas();
protected:
void paintEvent(QPaintEvent *event);
void keyPressEvent(QKeyEvent *event);
};
//Never hits this keyPressEvent!!!
void tetris_canvas::keyPressEvent(QKeyEvent * event)
{
if (event->key() == Qt::Key_Down)
{
rect->moveBottom(20);
update();
}
}
然后我有我的main_window类:
class main_window : public QWidget
{
Q_OBJECT
public:
main_window(QWidget* parent = 0, Qt::WFlags flags = 0);
~main_window();
protected:
void keyPressEvent(QKeyEvent * event);
};
//This keyPressEvent is hit!
void main_window::keyPressEvent(QKeyEvent* event)
{
if (event->key() == Qt::Key_Escape)
{
QApplication::exit(0);
}
QWidget::keyPressEvent(event);
}
我的问题是,如何让tetris_canvas
小部件中的keyPressEvent
响应按键操作?
我在画布内绘图,我需要响应按键,这样用户才能与画布上的东西交互。
小部件被添加到ctor或我的main_window
类中的QGridLayout
中。
发布于 2011-10-25 01:35:51
小部件最初必须调用
setFocusPolicy()
来接受焦点,并获得焦点才能接收按键事件。
所以你应该这么做。(因为您没有显示您的构造函数,所以我猜您错过了这一部分。)
另外,后面的一行写着:
如果您重新实现此处理程序,则在不按键操作的情况下调用基类实现是非常重要的。
你在你的小部件中忽略了这一点,但是在你的主窗口中这样做。请确保在这两个地方都这样做。
https://stackoverflow.com/questions/7879385
复制相似问题