Moja klasa GUI w konstruktorze tworzy nowy obiekt mojej klasy bazy danych. Wygląda tak:

GUI::GUI(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);
    Baza *plik = new Baza();
    connect(ui.insertBtn, &QPushButton::clicked, this, &GUI::run);
}

Udało mi się uzyskać dane użytkownika z QDialog:

void GUI::run() {
    DialogInput dialog;
    dialog.exec();
    site_text = dialog.getSite();
}

Jak powinienem przejść site_text, aby funkcjonować w klasie Baza? Muszę użyć tego obiektu (Plik) utworzonego w konstruktorze GUI, ale nie mogę uzyskać dostępu do funkcji GUI::run().

2
shadowPlay 28 luty 2019, 22:35

2 odpowiedzi

Najlepsza odpowiedź

Dodaj plik do deklaracji GUI:

class GUI : public QWidget {
    // ...
    Baza* plik;
};

Następnie w konstruktorze

GUI::GUI(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);
    plik = new Baza();
    connect(ui.insertBtn, &QPushButton::clicked, this, &GUI::run);
}

Wraz ze wzrostem kodu plik zostanie przeciekany, gdy tylko konstruktor GUI zakończy.

Oczyść plik W destructor:

GUI::~GUI()
{
    // ...
    delete plik;
}

Alternatywnie, użyj std::unique_ptr, aby zapisać plik w GUI, więc nie musisz pamiętać, aby go zniszczyć. Lub, jeśli plik korzyści wynikające z QObject (np. W przypadku sygnałów i slotów), możesz go rodzicielskiemu do GUI i QT obsłuży niszczenia. W obu przypadkach ta rada zakłada plik ma ten sam czas życia, co GUI.

5
28 luty 2019, 19:49

Po utworzeniu wskaźnika wewnątrz konstruktora zakres obiektu jest do końca konstruktora.

Musisz utworzyć globalną zmienną prywatną do klasy GUI, aby uzyskać dostęp do całej metody w tej samej klasie. Baza * pLink;

Kiedy tworzysz wskaźnik w konstruktorze, nie zapomnij usunąć tego samego wskaźnika w zniszczeniu.

class GUI : public QWidget{
   //...
   GUI();
   ~GUI();
private:
   Baza * pLink;
}

GUI::GUI(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);
    pLink = new Baza();
    connect(ui.insertBtn, &QPushButton::clicked, this, &GUI::run);
}

GUI::~GUI()
{
    delete pLink;
}

void GUI::run() {
    DialogInput dialog;
    dialog.exec();
    site_text = dialog.getSite();
    /* use the pointer to call the method to pass site_text */
    pLink->SomeMethod(site_text);
}

Konwencja nazewnictwa zagrałaby dużą rolę, gdy deklarujesz zmienne lokalne dla funkcji i zmiennych globalnych dla klasy. Tak więc użyj pLink lub rozważ przy użyciu m_pLink gdzie m_ zostanie dodany do wszystkich zmiennych globalnej i {x3}} dla typu wskaźnika.

0
Bhaumik Mistry 28 luty 2019, 19:55