Qt C ++如何在类中使用keyPressEvent作为QWidget

时间:2013-11-12 18:33:27

标签: c++ qt events

我正在尝试使用keyPressEvent,但它仅在窗口具有焦点而不是任何QWidgets时才起作用。

这是我的代码:

在customdialog.h中:

class CustomDialog : public QDialog, public Ui::CustomDialog 
{
    Q_OBJECT

private:
    Ui::CustomDialog *ui;

    QString lastKey;

public:
    CustomDialog(QWidget * parent = 0);

protected:
    void keyPressEvent(QKeyEvent *e);

};

在customdialog.cpp中:

void CustomDialog::keyPressEvent(QKeyEvent *e)
{
    lastKey = e->text();
    qDebug() << lastKey;
}

如何让这个类中的所有小部件使用相同的keyPressEvent?

2 个答案:

答案 0 :(得分:2)

您可以通过向CustomDialog的每个子项安装事件过滤器来解决您的问题:

void CustomDialog::childEvent(QChildEvent *event)
{
    if (event->added()) {
        event->child()->installEventFilter(this);
    }
}

bool CustomDialog::eventFilter(QObject *, QEvent *event)
{
    if (event->type() == QEvent::KeyPress)
        keyPressEvent(static_cast<QKeyEvent*>(event));
    return false;
}

但是由于每个被忽略的keyPress事件都被发送到父窗口小部件,因此可以为同一事件多次调用keyPressEvent。

答案 1 :(得分:0)

为了我的目的,我最终决定不在这种情况下使用keyPressEvent。我只需要在QTextBrowser中按下最后一个键。这是我最终做的事情:

connect(ui->textBrowser, SIGNAL(textChanged()), this, SLOT(handleTextBrowser()));

void CustomDialog::handleTextBrowser()
{    
    QTextCursor cursor(ui->textBrowser->textCursor());

    QString key = ui->textBrowser->toPlainText().mid(cursor.position() - 1, 1);
    qDebug() << key;
}