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
變量在一個頁面上。我知道如何用指針做到這一點,但我想知道爲什麼這不起作用。
它看起來像我有一個基本的誤解的地方什麼是這背後,我想它清除掉我做一些愚蠢:)
是的,我會說,你說得對,這就是你要去的地方錯了行。您通過引用傳遞'_directory',然後將其複製到本地變量中。 – tmpearce
使用QSharedPointer可能更加明確且不易出錯。 (無意外複製)。 –
輝煌的,謝謝你們(不能接受我自己的答案几天,所以如果有人想要點...)。 – kai