Russian Qt Forum
Ноябрь 24, 2024, 07:05 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Можно ли так..  (Прочитано 7533 раз)
Nikolay_Kr
Гость
« : Октябрь 25, 2007, 17:43 »

Есть приложение с главным окном при запуске из конструктора главного окна вызывается диалог и спрашивает пароль.
вопрос: можно завершить работу приложения прямо из конструктора главного окна.

Если спросил фигню извините Улыбающийся

при вызове close() из конструктора ничего не происходит.
« Последнее редактирование: Октябрь 25, 2007, 17:45 от Nikolay_Kr » Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #1 : Октябрь 25, 2007, 17:45 »

Можно, но вобще это очень плохая практика. Так делать ненужно
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Nikolay_Kr
Гость
« Ответ #2 : Октябрь 25, 2007, 17:47 »

А чем именно плох данный способ?
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #3 : Октябрь 25, 2007, 17:51 »

Ты прерываешь работу конструктора. Объект будет неполностью создан. А это не есть гуд. Создай объект, после этого вызови метод, который запросит пароль
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Steven_Orko
Гость
« Ответ #4 : Октябрь 25, 2007, 17:54 »

Хотя бы тем, что, если возникла такая необходимость, то это говорит о плохом проектировании. ИМХО.

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

К тому же конструктор по определении служит для создания экземпляра класса, но никак не для его уничтожения. Если уж так надо, выкидывай исключение. Это делать можно, но никто не гарантирует правильного освобождение уже занятых экземпляром класса ресурсов.
« Последнее редактирование: Октябрь 25, 2007, 18:00 от Steven_Orko » Записан
Nikolay_Kr
Гость
« Ответ #5 : Октябрь 25, 2007, 17:55 »

Спасибо, учту.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #6 : Октябрь 25, 2007, 19:15 »

Я делаю так:
1. В майн создаю диалог с требованием пароля.
2. Если верно, то создаю главное окно.
3. Если не верно, то просто return из майн.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Kainit
Гость
« Ответ #7 : Октябрь 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;
}

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

Короче говоря, если цель просто сделать хоть-какую-то авторизацию, то можно и так, но если делать грамотно, то надо сначала почитать грамотные статейки.
« Последнее редактирование: Октябрь 26, 2007, 14:18 от Kainit » Записан
Alexandr Az
Гость
« Ответ #8 : Октябрь 29, 2007, 10:40 »


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

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

Не понял, как ты собираешься это хакать?Непонимающий
что, пропустишь окно авторизации? Ой как страшно, авторизирует тебя не программа, а БД, и без коннекта к ней толку никакого....
Записан
Kainit
Гость
« Ответ #9 : Октябрь 29, 2007, 12:12 »

Извиняюсь за оффтоп и пустые споры, но разговора о базах в этом топике вообще не было... Был лишь вопрос о модальном диалоге для авторизации.
Записан
Dodge
Гость
« Ответ #10 : Октябрь 29, 2007, 14:19 »

Цитировать
Можно ли так...
нельзя и не спрашивайте почему.  Смеющийся
Записан
Alex03
Гость
« Ответ #11 : Октябрь 30, 2007, 07:42 »

В конструкторе окна шлёшь ему же постмессадж, или сигнал таймером с нулевым таймаутом. В соответствующем слоте создаёшь/вызываешь диалог, по результатам можно окно и уничножить/закрыть.
Записан
Lion
Гость
« Ответ #12 : Октябрь 30, 2007, 07:46 »

Попробуй юзать deleteLater()
Записан
Sergey B.
Программист
*****
Offline Offline

Сообщений: 544



Просмотр профиля WWW
« Ответ #13 : Октябрь 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"));
}
}



Всё лишнее убрал.
« Последнее редактирование: Октябрь 30, 2007, 08:27 от Sergey B. » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.047 секунд. Запросов: 23.