Russian Qt Forum

Qt => Общие вопросы => Тема начата: Nikolay_Kr от Октябрь 25, 2007, 17:43



Название: Можно ли так..
Отправлено: Nikolay_Kr от Октябрь 25, 2007, 17:43
Есть приложение с главным окном при запуске из конструктора главного окна вызывается диалог и спрашивает пароль.
вопрос: можно завершить работу приложения прямо из конструктора главного окна.

Если спросил фигню извините :)

при вызове close() из конструктора ничего не происходит.


Название: Re: Можно ли так..
Отправлено: pastor от Октябрь 25, 2007, 17:45
Можно, но вобще это очень плохая практика. Так делать ненужно


Название: Re: Можно ли так..
Отправлено: Nikolay_Kr от Октябрь 25, 2007, 17:47
А чем именно плох данный способ?


Название: Re: Можно ли так..
Отправлено: pastor от Октябрь 25, 2007, 17:51
Ты прерываешь работу конструктора. Объект будет неполностью создан. А это не есть гуд. Создай объект, после этого вызови метод, который запросит пароль


Название: Re: Можно ли так..
Отправлено: Steven_Orko от Октябрь 25, 2007, 17:54
Хотя бы тем, что, если возникла такая необходимость, то это говорит о плохом проектировании. ИМХО.

Если появляется окно ввода учетных данных, значит далее должно завершиться событие "подключение к системе (СУБД, корпоративной ИС и т.д.). Соответственно, до появления этого окна событие началось. Почему бы не исходить хотя бы из такой логики?

К тому же конструктор по определении служит для создания экземпляра класса, но никак не для его уничтожения. Если уж так надо, выкидывай исключение. Это делать можно, но никто не гарантирует правильного освобождение уже занятых экземпляром класса ресурсов.


Название: Re: Можно ли так..
Отправлено: Nikolay_Kr от Октябрь 25, 2007, 17:55
Спасибо, учту.


Название: Re: Можно ли так..
Отправлено: Пантер от Октябрь 25, 2007, 19:15
Я делаю так:
1. В майн создаю диалог с требованием пароля.
2. Если верно, то создаю главное окно.
3. Если не верно, то просто return из майн.


Название: Re: Можно ли так..
Отправлено: Kainit от Октябрь 26, 2007, 14:15
Собственно, как я понял, предлагается такой вариант:

Код:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
a.setQuitOnLastWindowClosed(true);

QDialog *AutorizeForm = new TAutorizeForm(NULL,Qt::FramelessWindowHint);

if(AutorizeForm->exec() == QDialog::Accepted)
{
delete AutorizeForm; 

QMainForm* mainForm = new QMainForm();
mainForm->show();
return a.exec();
}

return 0;
}

Хуже и предложить невозможно, поскольку с точки зрения безопасности, считай что ты можешь вообще никакой авторизации не делать - это хакается за секунду.

Короче говоря, если цель просто сделать хоть-какую-то авторизацию, то можно и так, но если делать грамотно, то надо сначала почитать грамотные статейки.


Название: Re: Можно ли так..
Отправлено: Alexandr Az от Октябрь 29, 2007, 10:40

Хуже и предложить невозможно, поскольку с точки зрения безопасности, считай что ты можешь вообще никакой авторизации не делать - это хакается за секунду.

Короче говоря, если цель просто сделать хоть-какую-то авторизацию, то можно и так, но если делать грамотно, то надо сначала почитать грамотные статейки.

Не понял, как ты собираешься это хакать????
что, пропустишь окно авторизации? Ой как страшно, авторизирует тебя не программа, а БД, и без коннекта к ней толку никакого....


Название: Re: Можно ли так..
Отправлено: Kainit от Октябрь 29, 2007, 12:12
Извиняюсь за оффтоп и пустые споры, но разговора о базах в этом топике вообще не было... Был лишь вопрос о модальном диалоге для авторизации.


Название: Re: Можно ли так..
Отправлено: Dodge от Октябрь 29, 2007, 14:19
Цитировать
Можно ли так...
нельзя и не спрашивайте почему.  ;D


Название: Re: Можно ли так..
Отправлено: Alex03 от Октябрь 30, 2007, 07:42
В конструкторе окна шлёшь ему же постмессадж, или сигнал таймером с нулевым таймаутом. В соответствующем слоте создаёшь/вызываешь диалог, по результатам можно окно и уничножить/закрыть.


Название: Re: Можно ли так..
Отправлено: Lion от Октябрь 30, 2007, 07:46
Попробуй юзать deleteLater()


Название: Re: Можно ли так..
Отправлено: Sergey B. от Октябрь 30, 2007, 08:22
Из конструктора главной формы показывать класс запроса пароля плохо, уже потому-что, если он не правильный, то главная форма будет проскакивать на экране всё равно (представь что подумают о тебе юзеры). Поэтому надо сделать отдельный класс для проверки паролей, и если всё окей, создавать главную форму.

Создаёшь диалог с запросом пароля, который возвращает QDialog::Accepted только если пароль верен.

В main.cpp делаешь так:
Код:
int main(int argc, char* argv[]){
AuthenticDialogForm dlg;
MainForm mf;
if (!dlg.exec()==QDialog::Accepted){
return 1;
}else {

mf.show();
return app.exec();
}
}

В классе запроса пароля вешаешь слот на кнопку ОК:

Код:
void AuthenticDialogForm::Request(){
if (!namecomboBox->currentText().isEmpty())
{

QSqlQuery query;
query.prepare("SELECT operator_pass FROM operators WHERE operator_name=:username");
query.bindValue(":username", namecomboBox->currentText());
bool res=query.exec();
if (!res) QMessageBox::warning(this, tr("Soft"),query.lastError().text());
query.first();
if (query.value(0).toString()== passlineEdit->text())
{

accept();
} else {
QMessageBox::warning(this, tr("Soft"), tr("Wrong password"));
passlineEdit->clear();
}
}else {
QMessageBox::warning(this, tr("Soft"), tr("Select user name"));
}
}



Всё лишнее убрал.