Qt: вызывающий слот из приложения QML аварийно завершает работу [исключение сброса данных] - PullRequest
0 голосов
/ 02 августа 2011

Я работаю над мобильным приложением Qt для платформы symbian. У меня есть функция, которая изменяет текущий отображаемый экран, эта функция является слотом и поэтому может вызываться со стороны C ++ и из QML.

public slots:
void ChangeView(const QString & viewPath);

void Controller::ChangeView(const QString & viewPath) {
    if(this->view->status() == QDeclarativeView::Ready) {
        QDeclarativeProperty * property = new QDeclarativeProperty(this->view,"source", this->context);
        if(property->isValid()) {
            property->write(QVariant(viewPath));
            property->~QDeclarativeProperty();
        }
    }
    else if(this->view->status() == QDeclarativeView::Error) {
        QList<QDeclarativeError> errors  = this->view->errors();
        for(int i = 0; i < errors.size(); ++i) {
            qDebug() << "Error: " << errors.at(i);
        }

        errors.~QList();
    }
}

Вызов этой функции из C ++ работает просто отлично,

void Controller::Show() {
    this->window->setCentralWidget(this->view);
    this->menu->MainMenu();
    this->ChangeView("qml/Streemio/Login.qml");
    this->window->show();
}

однако приложение вылетает, когда я вызываю его из QML.

Button {
                 id: channels

                 anchors.top: nowPlaying.bottom
                 anchors.topMargin: -1

                 label: "Channels"
                 subLabel: "listen to default playlists"
                 imgSource:  "qrc:Streemio/img/channel_menu.png"
                 fontSize: 14
                 subFontSize: 7
                 buttonWidth: container.width

                                 Keys.onSelectPressed: {controller.ChangeView("qml/Streemio/Channels.qml")}
                 Keys.onDownPressed: {search.focus = true; flickArea.contentY = 75}
                                 Keys.onUpPressed: {nowPlaying.focus = true; flickArea.contentY = 0}
             }

Вот вывод приложения.

Starting application...
Application running with pid 770.
CAknSignalDataObserver::HandleUpdateL: UMA
CAknSignalPane::ShowUmaIconL: begin
CAknSignalPane::LoadSignalIconL: uma-off
CAknSignalPane::ShowUmaIconL: end
[Qt Message] QNetworkReplyImpl::_q_startOperation was called more than once
Process 770, thread 771 stopped at 0x71547a2a: A data abort exception has occurred.
Finished.

Что я здесь не так делаю? Спасибо.

Ответы [ 2 ]

1 голос
/ 04 августа 2011

Вы меняете вид, который обрабатывает нажатие кнопки? Если это так, то кнопка уничтожается, когда она находится в обработчике нажатия, и она падает. Решение состоит в том, чтобы метод changeView () вызывал асинхронное изменение. Самый простой способ добиться этого - поместить реальный код изменения представления в слот, который changeView () вызывает с помощью Qt :: QueuedConnection Это приведет к безопасному уничтожению текущего представления и созданию нового представления при следующем вводе цикла событий.

0 голосов
/ 02 августа 2011

Я собираюсь сделать дикое предположение здесь и сказать, что это оскорбительная строка кода:

property->~QDeclarativeProperty();

Если вы не делаете что-то действительно странное за кулисами, эта строка, вероятно, должна читать

delete property;
...