我有一個繼承 QLabel 的類。并且只有在單擊 Tab 后才呼叫 keyPressEvent
enum ElemntType { tBall, tWall, tGate, tPacman, tGhost, tWeakGhost, tPowerBall };
enum Dir { Left, Right, Up, Down, Stop };
class PacMan : public QLabel
{
Q_OBJECT
public:
explicit PacMan();
~PacMan() = default;
private:
QMovie anim;
Dir dir;
ElementType type;
int x, y;
private:
void keyPressEvent(QKeyEvent* event);
};
和cpp檔案
PacMan::PacMan()
: QLabel(), type(type), dir(Stop)
{
setFocus();
anim.setFileName("../Texture/startPacman.png");
anim.start();
setMovie(&anim);
setFixedSize(20, 20);
x = pos().x();
y = pos().y();
}
void PacMan::keyPressEvent(QKeyEvent* event)
{
switch (event->nativeVirtualKey())
{
case Qt::Key_A:
dir = Left;
anim.stop();
anim.setFileName("../Texture/lPacman.gif");
anim.start();
move(--x, y);
break;
case Qt::Key_D:
dir = Right;
anim.stop();
anim.setFileName("../Texture/rPacman.gif");
anim.start();
move( x, y);
break;
}
}
當我嘗試按鍵時,什么也沒有發生(keyPressEvent 根本沒有被呼叫),但是如果我按 Tab 鍵,那么 keyPressEvent 就可以正常作業。為什么會發生這種情況以及如何解決?
主檔案
int main(int argc, char* argv[])
{
QApplication app(argc, argv);
QGraphicsView view(new QGraphicsScene);
PacMan* move = new PacMan();
move->setFocusPolicy(Qt::StrongFocus);
view.scene()->addWidget(move);
view.show();
return app.exec();
}
uj5u.com熱心網友回復:
使用Qt::StrongFocus,您的小部件可以使用tab和獲得焦點mouse。但是,它并不一定能獲得焦點。強制它的一種方法是Qt::NoFocus在設定您的Qt::StrongFocus. 它可以完成(取自答案:如何在特定小部件上設定焦點):
for (auto widget : findChildren<QWidget*>())
if (! qobject_cast<QOpenGlWidget*>(widget)) widget->setFocusPolicy(Qt::NoFocus);
uj5u.com熱心網友回復:
我只是在 view.show() 之后一起呼叫了 setFocus
int main(int argc, char* argv[])
{
QApplication app(argc, argv);
QGraphicsView view(new QGraphicsScene);
PacMan* move = new PacMan();
view.scene()->addWidget(move);
view.show();
move->setFocus();
return app.exec();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/518487.html
標籤:C qt
上一篇:SQL2008中的回圈
