我正在尝试使用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?
答案 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;
}