切换QDeclarativeView的源

时间:2012-02-29 01:15:41

标签: c++ qt view swap

这里的第一个问题,请耐心等待。

我一直在尝试使用QDeclarativeView作为画布在QMainWindow上创建一个视图,但每当我尝试切换QDeclarativeView的源代码我的程序段错误时,我坦率地不知道为什么,或者如何解决它。

这是我的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 个答案:

答案 0 :(得分:4)

此崩溃似乎是由此对象方法中的旧文档管理的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();
};