Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt小部件未接收keyPressEvent_Qt_Qwidget_Qkeyevent - Fatal编程技术网

Qt小部件未接收keyPressEvent

Qt小部件未接收keyPressEvent,qt,qwidget,qkeyevent,Qt,Qwidget,Qkeyevent,我的子窗口小部件不获取keyPressEvents,而如果我将同一窗口小部件放在顶层窗口中,则会获取keyPressEvents。我试图设置它以获得焦点,但它对此没有任何影响。下面是代码,显示了我试图实现的目标 #include <QApplication> #include <QKeyEvent> #include <QLCDNumber> #include <QLabel> #include <QVBoxLayout> class

我的子窗口小部件不获取keyPressEvents,而如果我将同一窗口小部件放在顶层窗口中,则会获取keyPressEvents。我试图设置它以获得焦点,但它对此没有任何影响。下面是代码,显示了我试图实现的目标

#include <QApplication>
#include <QKeyEvent>
#include <QLCDNumber>
#include <QLabel>
#include <QVBoxLayout>

class DigitSummer: public QLCDNumber {
    Q_OBJECT

public:
    DigitSummer(QWidget *parent = nullptr) : QLCDNumber(parent) {
    }

protected:
    void keyPressEvent(QKeyEvent *event) override {
        display(intValue() + event->text().toInt());
    }
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

#if 1 // this version does not work, number does not increase
    QWidget widget;
    widget.setLayout(new QVBoxLayout());
    widget.layout()->addWidget(new QLabel("Press digits!"));
    DigitSummer summer; // in stack: must be after widget to avoid child delete
    widget.layout()->addWidget(&summer);
    widget.setFocusProxy(&summer); // I notice no effect!
    widget.show();

#else // this version works, number grows with keypresseas
    DigitSummer summer;
    summer.show();
#endif

    return a.exec();
}

#include "main.moc"
如何修复小部件以接收关键事件


建议安装事件过滤器,但我不想这样做,必须有一种自包含的方法来修复小部件本身。

我认为在小部件接受键盘输入之前,您需要为它设置事件过滤器。在你的电脑里试试

setFocusPolicy(Qt::StrongFocus);
话虽如此,我真的不知道为什么顶级和非顶级小部件的行为会有所不同


问题代码的工作版本:

#include <QApplication>
#include <QKeyEvent>
#include <QLCDNumber>
#include <QLabel>
#include <QVBoxLayout>

class DigitSummer: public QLCDNumber {
    Q_OBJECT

public:
    DigitSummer(QWidget *parent = nullptr) : QLCDNumber(parent) {
        setFocusPolicy(Qt::StrongFocus);
    }

protected:
    void keyPressEvent(QKeyEvent *event) override {
        display(intValue() + event->text().toInt());
    }
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QWidget widget;
    widget.setLayout(new QVBoxLayout());
    widget.layout()->addWidget(new QLabel("Press digits!"));
    widget.layout()->addWidget(new DigitSummer);
    widget.show();

    return a.exec();
}

#include "main.moc"
#包括
#包括
#包括
#包括
#包括
类DigitSummer:公共QLCDNumber{
Q_对象
公众:
DigitSummer(QWidget*parent=nullptr):QLCDNumber(parent){
setFocusPolicy(Qt::StrongFocus);
}
受保护的:
无效按键事件(QKeyEvent*事件)覆盖{
显示(intValue()+事件->文本().toInt());
}
};
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
QWidget小部件;
setLayout(新的QVBoxLayout());
widget.layout()->addWidget(新的QLabel(“按数字!”);
widget.layout()->addWidget(新的DigitSummer);
widget.show();
返回a.exec();
}
#包括“main.moc”

我认为在小部件接受键盘输入之前,您需要为它设置。在你的电脑里试试

setFocusPolicy(Qt::StrongFocus);
话虽如此,我真的不知道为什么顶级和非顶级小部件的行为会有所不同


问题代码的工作版本:

#include <QApplication>
#include <QKeyEvent>
#include <QLCDNumber>
#include <QLabel>
#include <QVBoxLayout>

class DigitSummer: public QLCDNumber {
    Q_OBJECT

public:
    DigitSummer(QWidget *parent = nullptr) : QLCDNumber(parent) {
        setFocusPolicy(Qt::StrongFocus);
    }

protected:
    void keyPressEvent(QKeyEvent *event) override {
        display(intValue() + event->text().toInt());
    }
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QWidget widget;
    widget.setLayout(new QVBoxLayout());
    widget.layout()->addWidget(new QLabel("Press digits!"));
    widget.layout()->addWidget(new DigitSummer);
    widget.show();

    return a.exec();
}

#include "main.moc"
#包括
#包括
#包括
#包括
#包括
类DigitSummer:公共QLCDNumber{
Q_对象
公众:
DigitSummer(QWidget*parent=nullptr):QLCDNumber(parent){
setFocusPolicy(Qt::StrongFocus);
}
受保护的:
无效按键事件(QKeyEvent*事件)覆盖{
显示(intValue()+事件->文本().toInt());
}
};
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
QWidget小部件;
setLayout(新的QVBoxLayout());
widget.layout()->addWidget(新的QLabel(“按数字!”);
widget.layout()->addWidget(新的DigitSummer);
widget.show();
返回a.exec();
}
#包括“main.moc”

的确如此。添加widget.setFocusPolicy(Qt::StringFocus)to main函数也修复了它,但正确的解决方案是将它添加到
DigitSummer
constructor中,而不是在main中弄乱焦点。我想我会用正确的代码编辑你的答案。@hyde我的答案实际上说明了
“在你的答案中…”
,所以这就是我的意图。或者我误解了你的评论?我只是想说为
小部件
设置focusPolicy和focusProxy也很有效,但它(在大多数情况下)不是正确的解决方案,最好在DigitSummer构造函数中进行设置。的确如此。添加widget.setFocusPolicy(Qt::StringFocus)
to main函数也修复了它,但正确的解决方案是将它添加到
DigitSummer
constructor中,而不是在main中弄乱焦点。我想我会用正确的代码编辑你的答案。@hyde我的答案实际上说明了
“在你的答案中…”
,所以这就是我的意图。或者我误解了你的评论?我只是想说为
小部件
设置focusPolicy和focusProxy也可以,但是(在大多数情况下)这不是正确的解决方案,最好在DigitSummer构造函数中进行设置。