Komunikacja pomiędzy oknami Qt Creator

0

Dzień dobry. Mam problem z przekazaniem wartości z mainwindow do nowo utworzonego registerwindow. W swoim programie chce dodać możliwość rejestracji nowego użytkownika w bazie danych. Dlatego chce przekazać konkretne wartości do nowego okna. Wiem, że powinno być to robione sygnałami, ale nie bardzo chce to działać w moim programie.

W pliku nagłówkowym głównego okna dodałem sygnał:

MainWindow.h

 signals:
    void GetDatabaseObject(Database&);




private slots:
    void on_loginButton_pressed();

    void on_registerButton_pressed();

Który jest emitowany podczas użycia przycisku "Register Button":

MainWindow.cpp

void MainWindow::on_registerButton_pressed()
{
    if(registerWindow != 0)
    {
        registerWindow->show();
    }
    emit GetDatabaseObject(dataBase);

}

w pliku nagłówkowym drugiego okna dodałem slot:

RegisterWindow.h

public slots:
    void on_registerWorkerContinueButton_pressed();
    void on_registerWorkerCancelButton_pressed();
    void SetDatabase(Database&);

Którego definicja wygląda następująco:

RegisterWindow.cpp

void RegisterWindow::SetDatabase(Database &value)
{
    dataBase = value;
    if(dataBase.GetConnectionStatus())
    {
        ui->registerWorkerClassDescriptionLabel->setText("Przekazano wlasciwy obietk!");
    }
    else
    {
        ui->registerWorkerClassDescriptionLabel->setText("Przekazano nie ten obiekt! Inna wersja obiektu!");
    }

}

na sam koniec w pliku main.cpp dodałem:

main.cpp

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow mainWindow;
    mainWindow.resize(1920,1080);
    mainWindow.move(0,0);
    mainWindow.show();

    RegisterWindow registerWindow;

    QObject::connect(&mainWindow,SIGNAL(GetDatabaseObject(Database&)),&registerWindow,SLOT(SetDatabase(Database&)));



    return a.exec();
}

Po przetestowaniu żaden tekst nie jest ustawiany w obiekcie ui w registerwindow. Wydaje mi się, że sam sens jest zachowany tzn. Wysyłam sygnał z mainwindow, w którym przekazuje obiekt do slotu w registerwindow. Nie wiem w którym miejscu popełniłem błąd. Szukam odpowiedzi od kilku dni w czeluściach Internetu, ale jeszcze nie znalazłem rozwiązania problemu. Gdyby ktokolwiek był w stanie mnie naprowadzić, albo podać jakąś wskazówkę, będę bardzo wdzięczny.

P.S. Klasa Database została przeze mnie utworzona na potrzeby obsługi połączenia z QSqlDatabse(zawiera logikę i funkcje potrzebne do obsługi sql).

Życzę miłego dnia

4

Wygląda na to, iż program jest skrzywiony już na etapie projektu. Takie coś raczej trzeba zezłomować, i zaplanować dorzecznie.

Mikołaj Nawrocki napisał(a):

W swoim programie chce dodać możliwość rejestracji nowego użytkownika w bazie danych. Dlatego chce przekazać konkretne wartości do nowego okna. Wiem, że powinno być to robione sygnałami, ale nie bardzo chce to działać w moim programie.

Primo, nie musi to być robione sygnałami. Co więcej, taki opis sugeruje iż warto byłoby stworzyć jakąś klasę opartą o modalny QDialog z plikiem .ui zawierającym pola 'nazwa użytkownika' oraz jakich tam jeszcze potrzebujesz., i robić zapis do bazy w metodzie accept() poprzez stworzenie QSqlRecord wypełnionego danymi z owych pól, i potem wrzucenie tegoż rekordu do tabeli użytowników.

Mikołaj Nawrocki napisał(a):

Klasa Database została przeze mnie utworzona na potrzeby obsługi połączenia z QSqlDatabse(zawiera logikę i funkcje potrzebne do obsługi sql).

Niestety nie mam dostępu do moich starych kodów, ale z tego co pamiętam jak potrzebowałem dobierać się w Qt do sqlowej bazy danych tworzyłem sobie dla wygody klasę DatabaseAccessor jako leniwy singleton która mi robiła te wszystkie potrzebne addDatabase(), setName() itd., oraz zwracała główny indeks tudzież tabelę czy QSqlQuery.

1

ja od siebie dodam taki przykład - obczaj...

chcę jeszcze zwrócić uwagę, że jak wysyłasz hasło w sieć, to nie wysyłaj hasła jawnym tekstem ale użyj do tego celu QCryptographicHash

no chyba, że ktoś z forumowiczów ma jakiś mądrzejszy przykład niż mój. Ja tylko przesyłam coś na rozgrzanie szarych komórek.

PS1. Ten przykład nie jest typowym rozwiązaniem twojego problemu, to tylko jedna z wielu koncepcji jak (...) przekazać konkretne wartości do nowego okna (...)
PS2. Nie rób nowego okna przez QWidget jak ja to zrobiłem (bo poszedłem na skróty) ale zrób nową klasę która odziedziczy po QDialog

0

@MasterBLB: Dzięki za odpowiedź! Nie będę ukrywał, że QDialog „gdzieś” mi mignęło w czasie szukania sposobu no zrobienie okna rejestracji, ale jak widać zignorowałem i zrobiłem „po swojemu” (przekombinowałem), chociaż rozwiązanie miałem pod ręką, a powiedziałbym nawet, że się o nie potknąłem :) Co do singletona to też fajny pomysł na który nie wpadłem. Podsumowując, program skopany na etapie projektowania. Dzięki za wskazówki : ]

@zkubinski: Dzięki za przydatne wskazówki. O QCryptographicHash nie słyszałem a wygląda ciekawie :)

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