Ratloser schrieb:
> MainWindow::MainWindow(QWidget *parent) :
> QMainWindow(parent),
> ui(new Ui::MainWindow)
> {
> ui->setupUi(this);
>
> QGraphicsScene* scene = new QGraphicsScene( QRect(0, 0, 300, 300) );
logisch.
Das hier ist eine lokale Variable in dieser Funktion.
Ist die Funktion beendet, löst sich diese Variable in Luft auf.
> private:
> Ui::MainWindow *ui;
> QGraphicsScene* scene;
Das ist aber eine andere scene Variable und hat mit der im Konstruktor
erzeugten nichts zu tun.
Ergo: in deinem Button Handler greifst du auf eine ganz andere Variable
zu, als die die du im Konstruktor benutzt hast.
Tip: Genau aus diesen und ähnlichen Gründen, bekommen Member-Variablen
gerne einen Zusatz, so dass man aus dem Variablennamen schon ersehen
kann, ob man es mit einer Membervariablen oder mit einer funkionslokalen
Variablen zu tun hat.
Microsoft hat in der MFC die Konvention eingeführt, dass Membervariablen
an einem Präfix m_ zu erkennen sind. Aber auch die Konvention eines
Postfix Underscores erfreut sich großer Beliebtheit.
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui_;
QGraphicsScene* scene_;
private slots:
void on_pushButton_clicked();
};
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QGraphicsScene* scene = new QGraphicsScene( QRect(0, 0, 300, 300) );
scene->addText("Hello, world!");
ui->graphicsView->setScene(scene);
ui->graphicsView->show();
}
Das kann daher nicht stimmen. Denn die Variable an die du ran willst,
(weil es eine Member Variable des Objekts ist) müsste scene_ heissen.
Und weil es eine Member Variable ist, kann daher auch hier keine
Variablendeklaration erfolgen. Membervariablen existieren ja schon, wenn
der Funktions-Körper eines Konstruktors loszulegen beginnt.
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
scene_ = new QGraphicsScene( QRect(0, 0, 300, 300) );
scene_->addText("Hello, world!");
ui->graphicsView->setScene(scene_);
ui->graphicsView->show();
}