Наиболее очевидная проблема с кодом заключается в том, что вы никогда не используете экземпляр secondpage
, который вы создаете, и connect()
для. Ни QQuickView
, в котором он создан. QQmlApplicationEngine
- это место, где вы загружаете и показываете свой main.qml
, а внутри вы создали совершенно новый экземпляр secondpage
.
Предполагая, что у вас есть законная причина для использования промежуточного класса HandleTextField
(вместо простого подключения ваших сигналов / слотов QML непосредственно в QML без C ++), я бы предложил альтернативную стратегию. Похоже, вы прочитали хотя бы некоторые из Взаимодействующих с объектами QML из C + , но обратите особое внимание на предупреждение , отображаемое в этой специфической части:
[1115 ] Предупреждение. Хотя существует возможность доступа к объектам QML из C ++ и манипулирования ими, этот подход не рекомендуется, за исключением целей тестирования и создания прототипов. ...blockquote>
Чтобы исправить существующий код (если в конце концов выберите этот маршрут):
main.qml
ApplicationWindow { id: applicationWindow1 StackLayout { id: swipeView ... Secondpage { objectName: "mySecondPage" // add an object name } } ... }
main.cpp
[1119 ] Примечание: код не проверен. Проверьте все предупреждения от Qt наint main(int argc, char *argv[]) { QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); QGuiApplication app(argc, argv); QQmlApplicationEngine engine; // First load the main QML file, which also loads the Secondpage item you want to access. engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); if (engine.rootObjects().isEmpty()) return -1; HandleTextField handleTextField; // Here we find the "Secondpage" item loaded into main.qml by its objectName property QObject *item = engine.rootObjects().first()->findChild
("mySecondPage"); if (item) { QObject::connect(item, SIGNAL(submitTextField(QString)), &handleTextField, SLOT(handleSubmitTextField(QString))); QObject::connect(&handleTextField, SIGNAL(setTextField(QVariant)), item, SLOT(setTextField(QVariant))); } return app.exec(); } stderr
(консоль), чтобы убедиться, что эти операцииconnect()
действительно успешны. Другая проблема с этим подходом заключается в том, что соединения Qt «старого стиля» могут быть проверены только во время выполнения (в отличие от «нового стиля», проверенного во время компиляции), и вы увидите предупреждение, только если вы активно просматриваете [1111 ] выход. Но это единственный способ подключения к сигналам / слотам QML.
Возможно, вам не повезло. Но это только предупреждение, а не окончательный ответ.
Ruby перехватывает начало определения класса, а не его конец, поскольку Унаследованный класс #
Определения класса b / c ruby не имеют реального конец. Они могут
быть возобновленным в любое время.
Несколько лет назад были разговоры о добавлении триггера const_added , но он еще не прошел. От Матца :
Я не собираюсь реализовывать все возможные ловушки. Поэтому, когда кто-то приходит с более конкретным использованием, я рассмотрю это снова. Было бы быть
const_added
, а неclass_added
.
Так что это может обработать ваш случай - но я не уверен (он может сработать и при запуске, когда он в конечном итоге будет реализован).
Что вы пытаетесь сделать с этим триггером? Может быть другой способ сделать это.
Если вы хотите предположить, что ваш Ruby реализует ObjectSpaces, вы можете посмотреть все экземпляры модели по факту, а затем соответствующим образом изменить их. Google предлагает http://phrogz.net/ProgrammingRuby/ospace.html