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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Можно ли так..  (Прочитано 7747 раз)
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

Сообщений: 5877


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


Просмотр профиля 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.028 секунд. Запросов: 23.