Does not name o type, problem z klasą

0

Pisząc grę kółko i krzyżyk natrafiłem na pewien problem, wszystko działa jednak po sprawdzeniu wyników chciałbym wyświetlić dialog, pobrać z głównego okna(MainWindow) zmienną wygrana(QString) i wyświetlić jej zawartość w utworzonym dialogu.

mainwindow.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "dialog.h"

namespace Ui {
    class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT;

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
   dialog mydialog; 

wywołuje dialog w mainwindow.cpp

 mydialog.exec();

dialog.h

#ifndef DIALOG_H
#define DIALOG_H
#include "mainwindow.h"
#include <QDialog>


namespace Ui {
    class dialog;
}
class dialog : public QDialog
{
    Q_OBJECT

public:
    explicit dialog(QWidget *parent = 0);
    ~dialog();
     MainWindow window;

private:
    Ui::dialog *ui;

};

#endif // DIALOG_H
 

błąd kompilatora:
'MainWindow' does not name a type dialog.h 17

1

Hm a po co Ci MainWindow window w klasie dialog?Tworzysz przez to paskudne zapętlenie

1
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QMainWindow>
#include "dialog.h"
 
namespace Ui {
    class dialog; // <------
    class MainWindow;
}
 
class MainWindow : public QMainWindow
{
    Q_OBJECT;
 
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
   Ui::dialog *mydialog;  // <------
#ifndef DIALOG_H
#define DIALOG_H
#include "mainwindow.h"
#include <QDialog>
 
 
namespace Ui {
    class dialog;
    class MainWindow; // <------
}
class dialog : public QDialog
{
    Q_OBJECT
 
public:
    explicit dialog(QWidget *parent = 0);
    ~dialog();
     Ui::MainWindow *window; // <------
 
private:
    Ui::dialog *ui;
 
};
 
#endif // DIALOG_H
0

MainWindow w dialogu potrzebuje żeby pobrać zmienną która zawiera nazwę zwycięzcy, chyba że jest inna możliwość przekazania tego?
Teraz skoro to jest wskaźnik to tworzę nowy obiekt tego typu:

mydialog = new dialog(); 

jednak po utworzeniu nie mam możliwości wywołać exec()?

1

to należy rozwiązać np konstruktorem dialogu:

 explicit dialog(const QString &zwyciezca,QWidget *parent = 0);

Inna opcja to tworząc dialog w mainWindow przekazać go jako parenta:

mydialog = new dialog(this);

a następnie qobjectcastować/staticcastować sobie gdzieś w dialogu wynik funkcji parent() na mainWindow i dobierać się do zmiennej (o ile jest publiczna tudzież mainWindow kumpluje się z dialogiem)

I jak to nie ma możliwości uruchomić mydialog->exec()?!Wskaźnik do utworzonego obiektu masz,to co niby Ci miałoby bronić używać jego funkcji składowych?

0

no niestety po utworzeniu obiektu

 mydialog = new dialog(this);

do mydialog intellisense nic nie pokazuje, kod

mydialog->exec();

wywala:

 cannot convert 'dialog*' to 'Ui::dialog' in assignment <- dotyczy tworzenia nowego obiektu mydialog
invalid use of incomplete type 'struct Ui::dialog'   <- proba wywolania exec()
forward declaration of 'struct Ui::dialog'  <- class dialog w namespace Ui
 
1

Hmmm czas na coś drastycznego-powywalaj we wszystkie namespace Ui{} oraz Ui::coś z definicji

Opcjonalnie pałować się w rodzaju

dialog=new Ui::dialog(this);

tudzież wrzucać do .cpp using namespace Ui;

0
mydialog = new Ui::dialog(this) 

próbowałem ale ciągle to nic nie dawało, a wywalić mam z namespace tylko class dialog? jutro będę próbował bo aktualnie nie mam pod ręką creatora

1

Źle to projektujesz i dlatego masz problemy.
Ten twój dialog nie powinien wiedzieć niczego o MainWindow!
A skąd wziąć dane o wygranym? Proste trzeba je dostarczyć.
W Dialog stwórz slot, który przyjmuje jako parametr daną, której ci brakuje (np void pokazZwyciesce(const QString &nazwaZwyciescy);). W tym slocie przetwórz tą daną odpowiednio i wywołaj exec().
Z MainWindow wywołasz sobie ten slot programowo, albo połączysz do odpowiedniego sygnału (twój wybór).

0

Ok, skorzystałem z pomocy MarekR22, utworzyłem slot w dialogu i wywołuje go z poziomu MainWindow. Dzięki wielkie za pomoc i zainteresowanie!

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