Существует ли рычаг, подобный Class#inherited, который это инициировало только после определения класса Ruby?

Наиболее очевидная проблема с кодом заключается в том, что вы никогда не используете экземпляр 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

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();
}
[1119 ] Примечание: код не проверен. Проверьте все предупреждения от Qt на stderr (консоль), чтобы убедиться, что эти операции connect() действительно успешны. Другая проблема с этим подходом заключается в том, что соединения Qt «старого стиля» могут быть проверены только во время выполнения (в отличие от «нового стиля», проверенного во время компиляции), и вы увидите предупреждение, только если вы активно просматриваете [1111 ] выход. Но это единственный способ подключения к сигналам / слотам QML.

20
задан user513951 1 January 2016 в 19:28
поделиться

2 ответа

Возможно, вам не повезло. Но это только предупреждение, а не окончательный ответ.

Ruby перехватывает начало определения класса, а не его конец, поскольку Унаследованный класс # Определения класса b / c ruby ​​не имеют реального конец. Они могут быть возобновленным в любое время.

Несколько лет назад были разговоры о добавлении триггера const_added , но он еще не прошел. От Матца :

Я не собираюсь реализовывать все возможные ловушки. Поэтому, когда кто-то приходит с более конкретным использованием, я рассмотрю это снова. Было бы быть const_added , а не class_added .

Так что это может обработать ваш случай - но я не уверен (он может сработать и при запуске, когда он в конечном итоге будет реализован).

Что вы пытаетесь сделать с этим триггером? Может быть другой способ сделать это.

9
ответ дан 30 November 2019 в 00:31
поделиться

Если вы хотите предположить, что ваш Ruby реализует ObjectSpaces, вы можете посмотреть все экземпляры модели по факту, а затем соответствующим образом изменить их. Google предлагает http://phrogz.net/ProgrammingRuby/ospace.html

1
ответ дан 30 November 2019 в 00:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: