2013-01-05 18 views
0

我想在QWizard的幾個頁面之間共享一個對象(一個QDir),這樣如果一個頁面改變了這個目錄的值,這個頁面會傳遞到所有其他pages.nSince這個對象不是可選的,我想通過傳遞一個引用而不是一個指針來共享它,所以我不需要擔心可能的空指針(這是正確的嗎?我已經閱讀過兩種意見)。下面是一個最小的測試用例:通過引用共享對象(在Qt中)

test.hpp:

#include <QApplication> 
#include <QWizard> 
#include <QDir> 
#include <QVBoxLayout> 
#include <QWizardPage> 
#include <QLineEdit> 

class TestWizard : public QWizard { 
    Q_OBJECT 
public: 
    TestWizard(QWidget* parent = 0); 
    QDir directory; 
}; 

class TestPage : public QWizardPage { 
    Q_OBJECT 

public: 
    TestPage(QDir& _directory, int _id, QWidget* parent = 0); 
    void initializePage(); 

public slots: 
    void setDirectory(QString new_dir); 

private: 
    QVBoxLayout* layout; 
    QDir directory; 
    QLineEdit* dir_edit; 
    int id; 

}; 

TEST.CPP:

#include "test.hpp" 
#include <iostream> 

TestWizard::TestWizard(QWidget* parent) : QWizard(parent){ 
    directory = QDir(); 
    addPage(new TestPage(directory, 0)); 
    addPage(new TestPage(directory, 1)); 
    addPage(new TestPage(directory, 2)); 
} 
TestPage::TestPage(QDir& _directory, int _id, QWidget* parent) 
    : QWizardPage(parent){ 

    directory = _directory; 
    id = _id; 

    layout = new QVBoxLayout; 
    dir_edit = new QLineEdit; 
    layout->addWidget(dir_edit); 
    this->setLayout(layout); 
    connect(dir_edit, SIGNAL(textChanged(QString)), 
     this, SLOT(setDirectory(QString))); 
} 
void TestPage::initializePage(){ 
    std::cout << id << ": " << directory.absolutePath().toUtf8().constData() 
       << std::endl; 
} 
void TestPage::setDirectory(QString new_dir){ 
    directory.setPath(new_dir); 
} 
int main(int argc, char* argv[]){ 
    QApplication app(argc, argv); 
    TestWizard wizard; 
    wizard.show(); 
    return app.exec(); 
} 

點擊通過這個和編輯文本給出結果,改變一個文本隻影響directory變量在一個頁面上。我知道如何用指針做到這一點,但我想知道爲什麼這不起作用。

它看起來像我有一個基本的誤解的地方什麼是這背後,我想它清除掉我做一些愚蠢:)

回答

0

我想我已經有點白癡之前,但只是爲了確認:

TEST.CPP:

TestPage::TestPage(QDir& _directory, int _id, QWidget* parent) 
    : QWizardPage(parent){ 

    directory = _directory; // This is where I'm going wrong 
... 
+0

是的,我會說,你說得對,這就是你要去的地方錯了行。您通過引用傳遞'_directory',然後將其複製到本地變量中。 – tmpearce

+0

使用QSharedPointer 可能更加明確且不易出錯。 (無意外複製)。 –

+0

輝煌的,謝謝你們(不能接受我自己的答案几天,所以如果有人想要點...)。 – kai