#include #include #include #include #include #include #include class LineEditContainer : public QWidget { public: LineEditContainer(QWidget *parent = nullptr) : QWidget(parent) { auto *layout = new QHBoxLayout(this); line_edit = new QLineEdit(this); layout->addWidget(line_edit); setFocusProxy(line_edit); } QLineEdit *line_edit; }; class MainWindow : public QMainWindow { public: MainWindow(QWidget *parent = nullptr) : QMainWindow(parent) { auto *main = new QWidget(); auto *layout = new QHBoxLayout(main); layout->setSpacing(100); auto *container1 = new LineEditContainer(); layout->addWidget(container1); std::cerr << "edit1: " << container1->line_edit << std::endl; main->setFixedSize(500, 200); main->setFocusPolicy(Qt::ClickFocus); main->setFocusProxy(container1); setCentralWidget(main); QTimer::singleShot(1000, [=]() { auto *container2 = new LineEditContainer(); layout->addWidget(container2); std::cerr << "edit2: " << container2->line_edit << std::endl; std::cerr << "QApplication focus widget before: " << qApp->focusWidget() << std::endl; std::cerr << "QMainWindow focus widget before : " << focusWidget() << std::endl; main->setFocusProxy(container2); std::cerr << "QApplication focus widget after : " << qApp->focusWidget() << std::endl; std::cerr << "QMainWindow focus widget after : " << focusWidget() << std::endl; // container2->line_edit is focus_widget, but keyboard events go to container1->line_edit. // The visual focus state is very wrong. }); } }; int main(int argc, char *argv[]) { std::cerr << "Qt version: " << QT_VERSION_STR << std::endl; QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); }