QWizardの複数のページ間でオブジェクト(QDir)を共有したいので、1つのページでこのディレクトリの値が変更された場合、これは他のすべてのページに引き継がれます。nこのオブジェクトはオプションではないため、共有したいと思います。ポインターではなく参照を渡すことで、nullポインターの可能性について心配する必要がありません(これは正しいですか?私は両方の方法で意見を読みました)。最小限のテストケースは次のとおりです。
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();
}
これをクリックしてテキストを編集すると、1つのテキストを変更するとdirectory
、1ページの変数にのみ影響するという結果になります。ポインタを使ってこれを行う方法は知っていますが、なぜこれが機能しないのかを理解したいと思います。
私はこの背後にあるものについてどこかで基本的な誤解を持っているようです、そして私が何か愚かなことをする前にそれを片付けたいです:)