1 Câu hỏi: Tiện ích Qt không nhận được keyPressEvent

câu hỏi được tạo ra tại Wed, May 8, 2019 12:00 AM

Tiện ích con của tôi không nhận được keyPressEvents, trong khi nếu tôi đặt tiện ích tương tự như cửa sổ cấp cao nhất thì nó cũng vậy. Tôi cố gắng đặt nó lấy nét, nhưng nó không có tác dụng gì trong việc này. Mã bên dưới, hiển thị những gì tôi cố gắng để làm việc.

#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"

Và để hoàn thành, tệp .pro cho cùng:

QT += core gui widgets
TARGET = QtMCVE
TEMPLATE = app
DEFINES += QT_DEPRECATED_WARNINGS
CONFIG += c++11
QMAKE_CXXFLAGS += -Wall -Wextra
SOURCES += main.cpp

Làm cách nào để sửa tiện ích để nhận các sự kiện chính?

Câu hỏi liên quan này đề xuất cài đặt bộ lọc sự kiện, nhưng Tôi không muốn làm điều đó, phải có một cách độc lập để tự sửa lỗi widget.

    
0
1 Câu trả lời                              1                         

Tôi nghĩ rằng bạn cần đặt chính sách tập trung cho các widget trước khi nó sẽ chấp nhận đầu vào bàn phím. Trong ctor của bạn hãy thử ...

setFocusPolicy(Qt::StrongFocus);

Đã nói rằng, tôi thực sự không chắc tại sao hành vi lại khác nhau đối với các tiện ích cấp cao nhất và không cấp cao nhất.

Phiên bản làm việc của mã câu hỏi:

#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"
    
1
2019-05-10 11: 56: 50Z
  1. Thật vậy. Thêm widget.setFocusPolicy(Qt::StringFocus); vào chức năng chính cũng sửa nó, nhưng giải pháp chính xác là thêm nó vào DigitSummer và không gây rối với tiêu điểm chính. Tôi nghĩ rằng tôi sẽ chỉnh sửa câu trả lời của bạn với mã chính xác.
    2019-05-10 11: 54: 18Z
  2. @ hyde Câu trả lời của tôi thực sự nêu rõ "In your ctor try..." vì vậy đó là ý định. Hay tôi đã hiểu nhầm ý kiến ​​của bạn?
    2019-05-10 11: 56: 55Z
  3. Tôi chỉ muốn nói rằng việc đặt FocusPolicy FocusProxy cho widget cũng hoạt động, nhưng nó (trong hầu hết các kịch bản) sẽ không đúng giải pháp, tốt hơn là thực sự làm điều đó trong hàm tạo DigitSummer.
    2019-05-10 11: 58: 52Z
nguồn đặt đây