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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Ожидание ответа от формы  (Прочитано 3688 раз)
Digan
Гость
« : Август 21, 2011, 18:30 »

Есть две формы. При определенных событий на первой появляется диалог - вторая форма на которой две кнопки.

В классе второй формы я добавил один атрибут и один метод:
Код
C++ (Qt)
   bool isSelectDelete();
 
   bool deleteFile;
 

Атрибуту deleteFile в конструкторе формы присвоено:
Код
C++ (Qt)
deleteFile = false;

Слоты кнопок:
Код
C++ (Qt)
void DeleteDialog::on_pushButton_clicked()
{
   deleteFile = true;
}
 
void DeleteDialog::on_pushButton_2_clicked()
{
   deleteFile = false;
}
 

Метод isSelectDelete()
Код
C++ (Qt)
bool DeleteDialog::isSelectDelete()
{
   return deleteFile;
}
 

Как сделать так, чтобы первая форма ожидала клика на одну из кнопок второй формы? И как первой форме узнать именно на какую кнопку кликнул пользователь во второй?

Вот так не получается:
Код
C++ (Qt)
DeleteDialog* deleteDial = new DeleteDialog();
deleteDial->show();
 
if(deleteDial->isSelectDelete())
{
}
 

т.к. deleteDial->isSelectDelete() возвращает false. Как сделать, что обработчик ожидал ответа от формы, а не выполнялся дальше?
« Последнее редактирование: Август 21, 2011, 18:40 от Digan » Записан
Mikhail
Программист
*****
Offline Offline

Сообщений: 587


Просмотр профиля
« Ответ #1 : Август 21, 2011, 18:39 »

Соедини сигналы clicked() кнопок со слотом первой формы.
В слоте вызови sender() и получишь указатель на кнопку.

А вообще то желательно читать кники по Qt и Assistant.
Такие вопросы задаются в разделе Вопросы новичков
Записан
Digan
Гость
« Ответ #2 : Август 21, 2011, 20:08 »

Я смотрел Бланшет, но те примеры мне не помогли или я не там смотрел.

У меня только пока такой вариант:
Код
C++ (Qt)
void MainWindow::on_actionDelete_triggered()
{
   deleteDial = new DeleteDialog(this);
   connect(deleteDial, SIGNAL(deleteDial->on_pushButton_clicked()), this, SLOT(deleteFile()));
   deleteDial->show();
}
 

Он он не работает.
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #3 : Август 21, 2011, 20:12 »

Он он не работает.
Разумеется deleteDial->on_pushButton_clicked() - это слот, а не сигнал.
Записан
Etud
Гость
« Ответ #4 : Август 21, 2011, 20:28 »

...именно поэтому нужно добавить сигнал сюда:

Код
C++ (Qt)
void DeleteDialog::on_pushButton_clicked()
{
   deleteFile = true;
 
   emit delFileSignal();  //+++
}
 

-и не забудь добавить в заголовок my.h;
-и не забудь связать нужный сигнал с нужным слотом.

з.ы.
1) можно и без sender(), всего 2 кнопки со своими сигналами;
2) можно почитать у Шлее про сигналы-слоты.
Записан
Рома
Гость
« Ответ #5 : Август 21, 2011, 22:11 »

А может, еслина в диалоговом окне только 2 кнопки, то пусть при нажатии на 1-ю кнопку в диалоге вызывается слот accept() , а при нажатии на вторую reject(). Ну, а в основной форме проверять результат ф-и exec().
Примерно так:

В конструкторе диалога:
Код:
connect(on_pushButton,SIGNAL(clicked()),this,SLOT(accept()));
connect(on_pushButton_2,SIGNAL(clicked()),this,SLOT(reject()));

А в основной форме:
Код:
DeleteDialog* deleteDial = new DeleteDialog();

if(deleteDial->exec() == QDialog::Accepted)
{
//нажата первая кнопка
}
else
{
//Нажата вторая кнопка
}

И вместо коментариев просто написать нужный код
Записан
Digan
Гость
« Ответ #6 : Август 21, 2011, 23:49 »

А может, еслина в диалоговом окне только 2 кнопки, то пусть при нажатии на 1-ю кнопку в диалоге вызывается слот accept() , а при нажатии на вторую reject(). Ну, а в основной форме проверять результат ф-и exec().
Примерно так:

В конструкторе диалога:
Код:
connect(on_pushButton,SIGNAL(clicked()),this,SLOT(accept()));
connect(on_pushButton_2,SIGNAL(clicked()),this,SLOT(reject()));

А в основной форме:
Код:
DeleteDialog* deleteDial = new DeleteDialog();

if(deleteDial->exec() == QDialog::Accepted)
{
//нажата первая кнопка
}
else
{
//Нажата вторая кнопка
}

И вместо коментариев просто написать нужный код

Спасибо. Это действительно работает.
И всем остальным спасибо, хотя я так и не смог понять ваши предложения. Придется еще разбираться в механизме сигналов и слотов.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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