通过引用共享对象(在Qt中)

时间:2013-01-05 02:22:04

标签: c++ qt

我想在QWizard的几个页面之间共享一个对象(一个QDir),这样如果一个页面改变了这个目录的值,这就会传到所有其他的页面。因为这个对象不是可选的,我会喜欢通过传递引用而不是指针来共享它,所以我不需要担心可能的空指针(这是正确的吗?我已经从两个方面阅读了意见)。这是一个最小的测试用例:

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变量。我知道如何使用指针执行此操作,但我想了解为什么这不起作用。

看起来我对这背后的内容有一个基本的误解,我想在做一些愚蠢的事情之前清除它:)

1 个答案:

答案 0 :(得分:0)

我想我有点像个白痴,但只是为了确认:

TEST.CPP:

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

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