Dwa okna w Qt

0

Witam.
Proszę o sprawdzenie poprawności poniższego kodu:

#ifndef OKNO1_H
#define OKNO1_H

#include <QWidget>
#include <QTimer>
#include "okno2.h"

class okno1 : public QWidget
{
    Q_OBJECT
public:
    explicit okno1(QWidget *parent = 0);

public slots:
    void showOkno2();

};
#endif // OKNO1_H

#include "okno1.h"


okno1::okno1(QWidget *parent) :
    QWidget(parent)
{
  setWindowTitle("Okno1");
  QTimer::singleShot(1000, this, SLOT(showOkno2()));

}

void okno1::showOkno2(){
  okno2 *Okno2= new okno2();
  Okno2->show();
}
#ifndef OKNO2_H
#define OKNO2_H

#include <QtGui/QMainWindow>

class okno2 : public QMainWindow
{
    Q_OBJECT

public:
    okno2(QWidget *parent = 0);
    ~okno2();
};

#endif // OKNO2_H
#include "okno2.h"

okno2::okno2(QWidget *parent)
    : QMainWindow(parent)
{
  setWindowTitle("Okno2");
}

okno2::~okno2()
{

}
//main.cpp
#include <QtGui/QApplication>
#include "okno1.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    okno1 *Okno1 = new okno1();
    Okno1->show();

    return a.exec();
}

Czy powyższy kod jest prawidłowy?
Jak usunąć obiekt Okno1 ?

0

jest błędny bo masz 2x wyciek. Jak tworzysz przy pomocy new to usuwasz i zwalniasz pamięć przy pomocy delete (chyba, ze widget posiada rodzica, wtedy on się zajmuje usuwaniem i nie musisz tego stosować). W tym kodzie zarówno okno1 jak i okno2 dwa nie posiadają rodziców więc musisz sam zadbać o posprzątanie po nich.

0
#ifndef OKNO1_H
#define OKNO1_H

#include <QWidget>
#include <QTimer>
#include "okno2.h"

class okno1 : public QWidget
{
    Q_OBJECT
public:
    explicit okno1(QWidget *parent = 0);
private:
   okno2 *Okno2;

public slots:
    void showOkno2();

};
#endif // OKNO1_H

#include "okno1.h"


okno1::okno1(QWidget *parent) :
    QWidget(parent)
{
  setWindowTitle("Okno1");
  QTimer::singleShot(1000, this, SLOT(showOkno2()));

}

okno1::~okno1()
{
  delete Okno2;
}

void okno1::showOkno2(){
  Okno2= new okno2();
  Okno2->show();
}

Przerobiłem to w ten sposób. Poprawnie?
W jaki sposób usunąć okno1?

0
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    okno1 *Okno1 = new okno1();
    Okno1->show();
    int res = a.exec();
    delete Okno1;
    return res;
}
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    okno1 Okno1;
    Okno1.show();
    return a.exec();
}
0

Nie uruchamia się destruktor pierwszego okna.

0
Taumas napisał(a)

Nie uruchamia się destruktor pierwszego okna.

W obu przypadkach się uruchamia.

0

Dodałem do main'a treść z posta powyżej (przez operator new).
Okno1 nie znika, wiec coś jest nie tak.

0

musi działać, ale jeśli już tak się upierasz przy swoim to pozostaw maina takiego jak na początku miałeś (w pierwszym poście), a w konstruktorze klasy okno1 dodaj "setAttribute(Qt::WA_DeleteOnClose);" Wtedy będzie usuwać podczas zamknięcia.

0

Chyba nie do końca się zrozumieliśmy. Podany przez Ciebie destruktor oczywiście działa prawidłowo ( przy zamknięciu formy ), natomiast mi chodziło o to, że najpierw uruchamia się okno 1 (jakiś czas jest aktywne), po tym czasie uruchamia się okno2 jednocześnie zamykając okno1.

0

no to dodaj do konstruktora tego okno1 to co podałem wyżej, a w metodzie gdzie tworzysz drugie

void okno1::showOkno2(){
  okno2 *Okno2= new okno2();
  Okno2->show();
  close();
}

Przy czym pamiętaj żeby w konstruktorze tego drugiego również nadać atrybut niszczący podczas zamykania okna.

1 użytkowników online, w tym zalogowanych: 0, gości: 1