Переключение источника QDeclarativeView - PullRequest
2 голосов
/ 29 февраля 2012

Первый вопрос здесь, так что терпите меня.

Я пытался создать представление для QMainWindow, используя QDeclarativeView в качестве холста, но всякий раз, когда я пытаюсь переключить источник QDeclarativeView, мои программные ошибки segfaults, и я, честно говоря, понятия не имею, почему или как исправитьЭто.

Вот моя функция swapView ().

void MainWindow::swapView(int view)
{
 switch (view)
 {
    case 0:
        cout << "Switching to Slideshow..." << endl;
        this->setSource("Slideshow.qml");
        break;
    case 1:
        cout << "Switching to Main Canvas..." << endl;
        this->setSource("Test.qml");
        cout << "Successfully switched to Main Canvas!" << endl;
        break;
 }
}

Вот метод setSource (), который он вызывает:

void MainWindow::setSource(QString fileName)
{
    this->ui->declarativeView->setSource(QUrl::fromLocalFile("Test.qml"));
}

Я попытался заменить код вышес кодом ниже, и он избавляется от segfault, но каждое окно открывается в отдельном окне, а не просто заменяет представление в QDeclarativeView.

void MainWindow::setSource(QString fileName)
{
    QDeclarativeView *view = new QDeclarativeView;
    view->setSource(QUrl::fromLocalFile(fileName));
    ui->declarativeView = view;
    ui->declarativeView->show();
}

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

Спасибо.

1 Ответ

4 голосов
/ 28 февраля 2013

Похоже, что этот сбой вызван уничтожением объекта C ++, управляемого старым документом внутри этого метода объекта. В моем случае у меня есть MuseArea, которая запускает слот в моем коде C ++, который переключает исходный документ. что-то вроде этого вылетает :

QML-код:

MouseArea {
    anchors.fill: parent
    onClicked: cppObject.action()
}

C ++ код

QDeclarativeView * viewInstance();

class CppObject: public QObject {
Q_OBJECT
public slots:
     void action() { viewInstance()->setSource("another.qml") }
};

Способ исправить это - использовать соединение в очереди где-то между кодом, вызываемым событием QML, и вызовом setSource. Следующий код хорошо работает :

QML-код:

MouseArea {
    anchors.fill: parent
    onClicked: cppObject.actionNeeded()
}

C ++ код

QDeclarativeView * viewInstance();

class CppObject: public QObject {
Q_OBJECT
public:
     explicit CppObject(QObject *parent = 0) : QObject(parent)
     {
         connect(
             this,SIGNAL(actionNeeded()),
             this,SLOT(action()),
             Qt::QueuedConnection
         );
     }
public slots:
     void action() { viewInstance()->setSource("another.qml") }
signals:
     void actionNeeded();
};
...