1 (27.06.2012 11:58:23 отредактировано marikk)

Пытаюсь сделать следующее: при запуске приложения вылетает окно авторизации, туда вводятся параметры подключения к базе данных далее если подключение успешно выводится основная форма, если нет, сообщение об ошибке и на выход.

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    auth w; // форма авторизации QDialog
    if (w.exec()){
        QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL");
        db.setHostName(w.data.at(0)); // w.data - QStringList содержащий параметры подключения
        db.setUserName(w.data.at(1));
        db.setPassword(w.data.at(2));
        db.setDatabaseName(w.data.at(3));
        db.setPort(w.data.at(4).toInt());
        if (db.open()){
            form v;   // главная форма
            v.show();
        }
        else {
            QMessageBox msgBox;
            msgBox.setText("Connect was failed");
            msgBox.setInformativeText(db.lastError().text());
            msgBox.setStandardButtons(QMessageBox::Ok);
            msgBox.exec();

        }
    }
    return a.exec();
}

Интересно почему форма ( form v) не отрабатывает show().

2

Для начала проверьте с каким кодом у вас закрывается форма авторизации.

#include <QDebug>
.......

int main(int argc, char *argv[])
{
     autn w;
     qDebug() << w.exec();
     return 0
}
То что не убивает нас, делает нас сильнее! © Ницше.
When life puts you in tough situations, don’t say "why me". Just say "try me".
GNU/Linux Debian

3

Чуть подробнее вообще опишите.
В случае ошибок у вас сообщения появляются в реальности?
Приложение нормально завершается или вываливается с ошибкой?

То что не убивает нас, делает нас сильнее! © Ницше.
When life puts you in tough situations, don’t say "why me". Just say "try me".
GNU/Linux Debian

4

voral пишет:

Для начала проверьте с каким кодом у вас закрывается форма авторизации.

#include <QDebug>
.......

int main(int argc, char *argv[])
{
     autn w;
     qDebug() << w.exec();
     return 0
}

Форма авторизации закрывается с кодом 1, Дальше происходит коннект к базе, потом отрабатывает конструктор объекта v. Но вот метод show (v.show();) не дает никакого результата, дальше исполнение идет по алгоритму.

5

voral пишет:

Чуть подробнее вообще опишите.
В случае ошибок у вас сообщения появляются в реальности?
Приложение нормально завершается или вываливается с ошибкой?

В случае отмены (закрытия, выбива) формы авторизации исполнение попадает на return a.exec();
В случае ошибки коннекта к базе данным выдается месадж бокс содержащий ошибку коннекта далее на return a.exec();
В случае подтвержданеия идет конект с базой дальше создание обьекта v;

В любом случае приложение остается в подвешеном состоянии, ошибок не выдает.

6

Так может дело в коде этой главной формы? Пошагово код проходили?

То что не убивает нас, делает нас сильнее! © Ницше.
When life puts you in tough situations, don’t say "why me". Just say "try me".
GNU/Linux Debian

7 (27.06.2012 14:24:04 отредактировано marikk)

Код формы самый простой, для отладки алгоритма.

QHBoxLayout *lay = new QHBoxLayout;
QPushButton *org = new QPushButton(tr("hi"));
lay->addWidget(org);
setLayout(lay);

Что примечательно, если обьявить обьект v и вызвать метод show док коннекта с базай данных:

         ..............
         form v;   // главная форма
         v.show();
         if (db.open()){
         .............

все отработает нормально и вызывается форма и происходит подключение к базе.

Мне кажется сам алгоритм криво задуман. Хотелось бы узнать как правильно, но нигде найти не могу ac

8

а если её на QWidget заменить?

95% процентов проблем находятся между клавиатурой и стулом.

9

marikk пишет:

        if (db.open()){
            form v;   // главная форма
            v.show();
        }

Я так понимаю, что форму v необходимо объявить сразу после QApplication a(argc, argv);, т.к. она у вас создается, отображается, после чего v выходит из области видимости, и для нее вызвается деструктор, т.е. форма уничтожается.

10 (27.06.2012 19:50:48 отредактировано marikk)

PhilB пишет:
marikk пишет:

        if (db.open()){
            form v;   // главная форма
            v.show();
        }

Я так понимаю, что форму v необходимо объявить сразу после QApplication a(argc, argv);, т.к. она у вас создается, отображается, после чего v выходит из области видимости, и для нее вызвается деструктор, т.е. форма уничтожается.

Так то оно выводит, но не знаю чево мне в голову взбрело создавать обьект после коннекта к базе. Наверно придется так сделать. Ошибку понял всем спасибо.