Jared Price
Jared Price

Reputation: 5375

Qt C++ how to use keyPressEvent for a QWidget within a class

I'm trying to use a keyPressEvent, but it is only working when the window has focus and not any of the QWidgets.

Here is my code:

In 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);

};

In customdialog.cpp:

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

How can I make all widgets within this class use the same keyPressEvent?

Upvotes: 2

Views: 4497

Answers (2)

Jared Price
Jared Price

Reputation: 5375

I ended up deciding not to use keyPressEvent in this case for my purposes. I just needed to get the last key pressed in a QTextBrowser. Here is what I ended up doing:

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;
}

Upvotes: 0

userr1728854
userr1728854

Reputation: 411

You can solve your problem by installing event filters to every child of 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;
}

But since every ignored keyPress event is sent to the parent widget, you can get keyPressEvent called multiple times for the same event.

Upvotes: 2

Related Questions