Connect wysypuje mi program

0

Hej,

Mam taki problem:
Jest okno o nazwie oknoWyszukaj wywoływane z poziomu okno_glowne (MainWindow) poprzez wywołanie go z paska menu.
OknoWyszukaj ma w sobie QListView, które po dwukliku w obiekt z listy, ma za zadanie przesłać nazwę tego obiektu do okno_glowne.

W jaki sposób to robię? Connectem:

okno_glowne.h

private slots:
    void on_lv_wyniki_clicked(const QModelIndex &index);
    void wypelnijPola(QString tytul); 

okno_glowne.cpp

 
void okno_glowne::on_commandLinkButton_clicked()
{
    oknoWyszukaj okno;
    okno.exec();

    oknoWyszukaj *ok;

    QObject::connect(ok, SIGNAL(przekazDane(QString)),this, SLOT(wypelnijPola(QString))); //Ta linia sypie program
}

oknoWyszukaj.h

 
signals:
    void przekazDane(QString sig);

oknoWyszukaj.cpp

 void oknoWyszukaj::on_lv_wyniki_doubleClicked(const QModelIndex &index)
{
    QString sig = index.data(Qt::DisplayRole).toString(); //QString klikniety wynik

    emit przekazDane(sig);

    oknoWyszukaj::close();
}

Nie wiem dlaczego (choć mam pewne podejrzenia), ale linia zaznaczona w okno_glowne.cpp sypie mi program.

1

Dobra, już wiem dlaczego mi sypie program. Taka mała zmiana w okno_glowne.cpp

 
void okno_glowne::on_commandLinkButton_clicked()
{
    oknoWyszukaj okno;
    okno.exec();
 
    oknoWyszukaj *ok = new oknoWyszukaj();
 
    QObject::connect(ok, SIGNAL(przekazDane(QString)),this, SLOT(wypelnijPola(QString))); //Ta linia sypie program
}

Ale teraz inny problem. Nie odpala mi się metoda wypelnijPola. Mam w nim qDebuga, który nie wyświetla komunikatu.

 void okno_glowne::wypelnijPola(QString tytul)
{
    QSqlQuery zapytanie;
    qDebug() << "Jestem";

    ui->gb_przydatnosc->setVisible(true);

    /*uzupelnienie pola lineEdit w wybrana fraze*/
    ui->le_szukaj->setText(tytul);

    /*uzupelnienie pola Opis i rozwiazanie*/
    zapytanie.exec(baza_pytan.select(sql_kolumny::tabela_wpisow,sql_kolumny::opis+", "+ sql_kolumny::rozwiazanie,"upper("+sql_kolumny::tytul+") = '"+tytul.toUpper()+"'"));
    zapytanie.next();
    ui->te_opis->setText(zapytanie.value(0).toString());
    ui->te_rozwiazanie->setText(zapytanie.value(1).toString());

    /*uzupelnienie list_view z zalacznikami*/
    ui->lv_zalaczniki->setModel(NULL);

    zapytanie.exec(baza_pytan.select(sql_kolumny::tabela_wpisow+", "+sql_kolumny::tabela_zalacznikow,sql_kolumny::zalaczniki,"upper("+sql_kolumny::tytul+") = '"+tytul.toUpper()+"' and "+sql_kolumny::zalaczniki_fk+" = "+sql_kolumny::zalaczniki_id));
    while(zapytanie.next())
    {
    baza_pytan.model->setQuery(zapytanie);
    ui->lv_zalaczniki->setModel(baza_pytan.model);
    }

    statystyki stat;
    stat.dodaj_wpis("statystyki_frazy","title",tytul,sql_kolumny::baza);

    /*Ustawianie listView z wynikami wyszukan na niewidoczna*/
    ui->lv_wyniki->setVisible(false);
}
1

Rozwiązałem to zupełnie inaczej, z użyciem zmiennych globalnych.

Gdyby komuś się to w przyszłości przydało:

okno_glowne.cpp

 

QString temp = "";

void okno_glowne::on_commandLinkButton_clicked()
{
    oknoWyszukaj okno;
    okno.exec();

    wypelnijPola();

void okno_glowne::przechwycSygnal(QString tytul)
{
    temp = tytul;
}

}

void okno_glowne::wypelnijPola()
{
    QSqlQuery zapytanie;
    QString tytul = temp;

        ui->gb_przydatnosc->setVisible(true);

        /*uzupelnienie pola lineEdit w wybrana fraze*/
        ui->le_szukaj->setText(tytul);

        /*uzupelnienie pola Opis i rozwiazanie*/
        zapytanie.exec(baza_pytan.select(sql_kolumny::tabela_wpisow,sql_kolumny::opis+", "+ sql_kolumny::rozwiazanie,"upper("+sql_kolumny::tytul+") = '"+tytul.toUpper()+"'"));
        zapytanie.next();
        ui->te_opis->setText(zapytanie.value(0).toString());
        ui->te_rozwiazanie->setText(zapytanie.value(1).toString());

        /*uzupelnienie list_view z zalacznikami*/
        ui->lv_zalaczniki->setModel(NULL);

        zapytanie.exec(baza_pytan.select(sql_kolumny::tabela_wpisow+", "+sql_kolumny::tabela_zalacznikow,sql_kolumny::zalaczniki,"upper("+sql_kolumny::tytul+") = '"+tytul.toUpper()+"' and "+sql_kolumny::zalaczniki_fk+" = "+sql_kolumny::zalaczniki_id));
        while(zapytanie.next())
        {
        baza_pytan.model->setQuery(zapytanie);
        ui->lv_zalaczniki->setModel(baza_pytan.model);
        }

        statystyki stat;
        stat.dodaj_wpis("statystyki_frazy","title",tytul,sql_kolumny::baza);

        /*Ustawianie listView z wynikami wyszukan na niewidoczna*/
        ui->lv_wyniki->setVisible(false);
}

oknoWyszukaj.cpp

okno_glowne *l;

void oknoWyszukaj::on_lv_wyniki_doubleClicked(const QModelIndex &index)
{
    QString sig = index.data(Qt::DisplayRole).toString(); //QString klikniety wynik

    oknoWyszukaj::close();

    l = new okno_glowne();
    l->przechwycSygnal(sig);
}
 

Temat do zamknięcia - pozdrawiam :)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.