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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Подключение диалогового окна  (Прочитано 16841 раз)
Петр91
Гость
« : Май 22, 2011, 15:19 »

Не могу разобраться в диалоговом окне, искал в инете и в справке и ничего толкового!! Описаны проблемы а руководства нет. Дайте ссылку, или лучше напишите код я сам разберусь!
Открыл creator создал форму, открыл его еще раз и создал QDialog форму диалогового окна. Объясните как подключить окно, и вызвать его!
Записан
Ovoshlook
Гость
« Ответ #1 : Май 22, 2011, 15:22 »

Ну смотря для чего окно

Самое простое-вот так сделать:

 QMessageBox::information(0,tr("information"),tr("No tabs for adding"),QMessageBox::Ok|QMessageBox::NoButton);

Это оно информации. Если нужно окно с выбором чего либо то лучше самому аписать, положить туда пару кнопок и связать их через connect с нужными функциями.
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


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


Просмотр профиля
« Ответ #2 : Май 22, 2011, 18:13 »

Открыл creator создал форму, открыл его еще раз и создал QDialog форму диалогового окна. Объясните как подключить окно, и вызвать его!
В функции главного окна:
Код
C++ (Qt)
MyDialog dialog; // создаём дилог
... // инициализация, если нужно
if (dialog.exec()) // показываем диалог, здесь стоим, пока диалог не закроют
{
   ... //код, если диалог закрыт accept()
}
else
{
   ... //код, если диалог закрыт reject()
}
Записан
Петр91
Гость
« Ответ #3 : Май 23, 2011, 05:32 »

Задача в сделать в отдельном окне параметры программы. Вообщем если объясните как сдлеать, все остальное станет ясно.
Есть главная форма с кнопкой "Параметры" и Текстлэйблом. При нажатии на кнопку открывается новое окно(форма) также с кнопкой, при нажатии на которую в главной форме в текстлэйбле отобразиться число. Напишите пожалуйста код! И мне сразу все станет ясно. Создал форму, создал диалоговое окно с кнопкой, а что дальше?
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


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


Просмотр профиля
« Ответ #4 : Май 23, 2011, 06:21 »

Я ж вам написал, что не show() диалог надо показывать, а exec().
Записан
Петр91
Гость
« Ответ #5 : Май 23, 2011, 07:20 »

Спасибо большое!!! Да все работает! Теперь остался самый главный вопрос, и можно приступать к работе! Имея кнопку на диалоговом окне, как ее связать с лэйблом на главной форме?
Пытаюсь сделать через connect но что то не так.

void Dial::on_pushButton_clicked()
{
     connect(Dial,SIGNAL(on_pushButton_clicked()),TKM,SLOT(ttl()));
}


Где Dial - класс диалогового окна, TKM - главная форма, on_pushButton_clicked() собственно нажатие кнопки, ttl() описаный мною слот для копирования в лэйбл текста. пишет ошибку
expected primary-expression before ',' token
Записан
Mikhail
Программист
*****
Offline Offline

Сообщений: 587


Просмотр профиля
« Ответ #6 : Май 23, 2011, 07:37 »

Скорее всего ваше диалоговое окно не знает ничего о главной форме, поэтому ругается и скорее всего на указатель главного окна TKM.

connect лучше делать в главной форме при создании диалоговог окна. В этом месте есть указатель на обе формы

 connect(Dial,SIGNAL( PushButton_clicked()),this,SLOT(ttl()));

Здесь PushButton_clicked() зто сигнал диалогового окна

В диалоговом окне соедините два сигнала - кнопки и сигнал окна
connect( this,SIGNAL( on_pushButton_clicked()), SIGNAL(PushButton_clicked()));
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


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


Просмотр профиля
« Ответ #7 : Май 23, 2011, 07:46 »

Связывайте не в диалоге (и уж тем более не в самом слоте), а перед его показом.
Если надо передавать число - логично его передать как параметр сигнала.
Т.е. в диалоге объявляете сигнал:
Код
C++ (Qt)
signals:
void sendTtl(int);

Нажатию кнопки его эмитите:
Код
C++ (Qt)
void Dial::on_pushButton_clicked()
{
    emit sendTtl( ui->lineEdit->text().toInt() );
}

Там где по кнопке показываете диалог - делаете коннект:
Код
C++ (Qt)
   Dial dial;
   connect(&Dial,SIGNAL(sendTtl(int)),this,SLOT(ttl(int)));

Исправляете слот ttl(int) так, чтобы он был с параметром и реализуете.

===========================================================

Но вообще правильнее с диалогом работать вот так:

1) По кнопке параметры вызываем диалог:
Нажатию кнопки его эмитите:
Код
C++ (Qt)
void MainWindow::on_paramButton_clicked()
{
    Dial dial; // создаём диалог
    if ( dial.exec() ) // показываем и ждём завершения
    {
        ui->label->setText( QString::number( dial.ttl ) ); // если диалог закрыт кнопкой ОК, то забираем результат
    }
}

2) В классе диалога объявляем паблик параметр ttl:
Код
C++ (Qt)
class Dial: public QDialog
{
    ...
    public:
        int ttl;
    ...
}

3) По нажатию на кнопку ОК диалога делаем:
Код
C++ (Qt)
void Dial::on_pushButton_clicked()
{
    ttl = ui->lineEdit->text().toInt(); // сохраняем результат
    accept(); // говорим что диалог выполнился успешно (а не закрыт с отменой)
}
« Последнее редактирование: Май 23, 2011, 07:55 от LisandreL » Записан
Петр91
Гость
« Ответ #8 : Май 23, 2011, 08:13 »


Нажатию кнопки его эмитите:
Код
C++ (Qt)
void Dial::on_pushButton_clicked()
{
    emit sendTtl( ui->lineEdit->text().toInt() );
}


Вы наверное имели в виду pushbutton которая принадлежит Dial а не lineEdit. Сделал все как вы говорили, такая же ошибка, правда раньше их две одинаковых было а теперь одна. В идеале мне ничего не надо передавать, а на диалоговом окне надо сделать, 4 радиобатана которые будут отображать соответствующие textEdit на главной форме. Как это сделать я знаю а вот саму связь устроить не получается.

void TKM::on_pushButton_clicked()
{
     Dial dial;
     dial.exec();
     connect(&Dial,SIGNAL(sendTtl(int)),this,SLOT(ttl(int)));
}

expected primary-expression before ',' token
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


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


Просмотр профиля
« Ответ #9 : Май 23, 2011, 08:17 »

Цитировать
Вы наверное имели в виду pushbutton которая принадлежит Dial а не lineEdit.
Число то у вас где вводится? Не в кнопку же.

Цитировать
connect(&dial,SIGNAL(sendTtl(int)),this,SLOT(ttl(int)));
Вы переменную dial должны связывать, а не тип Dial.
Записан
Петр91
Гость
« Ответ #10 : Май 23, 2011, 11:07 »


Но вообще правильнее с диалогом работать вот так:

1) По кнопке параметры вызываем диалог:
Нажатию кнопки его эмитите:
Код
C++ (Qt)
void MainWindow::on_paramButton_clicked()
{
    Dial dial; // создаём диалог
    if ( dial.exec() ) // показываем и ждём завершения
    {
        ui->label->setText( QString::number( dial.ttl ) ); // если диалог закрыт кнопкой ОК, то забираем результат
    }
}

2) В классе диалога объявляем паблик параметр ttl:
Код
C++ (Qt)
class Dial: public QDialog
{
    ...
    public:
        int ttl;
    ...
}

3) По нажатию на кнопку ОК диалога делаем:
Код
C++ (Qt)
void Dial::on_pushButton_clicked()
{
    ttl = ui->lineEdit->text().toInt(); // сохраняем результат
    accept(); // говорим что диалог выполнился успешно (а не закрыт с отменой)
}


Аааааааааа спасибо большое!!! Все работает. Я наверно вас уже достал, но лаба еще не сделала) Остались мелкие вопросы. после того как я вызываю форму .exec() я не могу выйти за ее пределы. теперь мне нужная другая форма но уже такая, что бы можно было кликать на главную форму, причем диалоговое окно должно оставаться поверх.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4732



Просмотр профиля WWW
« Ответ #11 : Май 23, 2011, 13:10 »

Код
C++ (Qt)
QDialog dialog;
dialog.show();
только тогда надо подписаться на сигнал accepted() (и rejected() если нужно), чтоб знать когда была нажата кнопка ОК или Cancel

либо вместо QDialog вообще QWidget использовать
« Последнее редактирование: Май 23, 2011, 13:13 от kambala » Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
vasilii_ru
Гость
« Ответ #12 : Февраль 26, 2012, 02:11 »

Спасибо LisandreL   Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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