2012-02-29 20 views
2

第一個問題在這裏,請耐心等待。切換QDeclarativeView的來源

我一直試圖創建一個QMainWindow使用QDeclarativeView作爲畫布的視圖,但每當我嘗試切換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")); 
} 

我試圖替換上面與下面的代碼的代碼,它擺脫了段錯誤的,但每個窗口在打開一個單獨的窗口,而不是隻替換QDeclarativeView上的視圖。

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

如果任何人有我做錯了任何輸入(我敢肯定,這是愚蠢的東西),請讓我知道...

感謝。

+0

嘗試使臨時測試變量'QUrl溫度= QUrl :: fromLocalFile( 「Test.qml」 );',看看它是否有效'temp.isValid()' - 也許這是問題之一?你發佈的代碼看起來很好,除非我錯過了一些東西。 – tmpearce 2012-02-29 01:40:39

+0

我按照您的建議使用了第二版的代碼,並且它每次都創建一個完全新窗口,並且它打印出提供的QUrl是有效的。 使用代碼的第一個版本,它的功能與最初使用有效的QUrl相同。加載第一個視圖很好,但後來segfaults當我嘗試加載第二個 – Tjsail33 2012-02-29 01:46:52

+0

我試過這段代碼,void switchView()if(view-> source()== QUrl(「qrc:/Rect.qml」)) {set_ource(QUrl(「qrc:/main.qml」)); (QUAR1(「qrc:/Rect.qml」));其他{0} } },它工作正常,什麼是segfault的來源? – Kunal 2012-02-29 04:01:45

回答

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(); 
};