Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Петр91 от Май 22, 2011, 15:19



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


Название: Re: Подключение диалогового окна
Отправлено: Ovoshlook от Май 22, 2011, 15:22
Ну смотря для чего окно

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

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

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


Название: Re: Подключение диалогового окна
Отправлено: LisandreL от Май 22, 2011, 18:13
Открыл creator создал форму, открыл его еще раз и создал QDialog форму диалогового окна. Объясните как подключить окно, и вызвать его!
В функции главного окна:
Код
C++ (Qt)
MyDialog dialog; // создаём дилог
... // инициализация, если нужно
if (dialog.exec()) // показываем диалог, здесь стоим, пока диалог не закроют
{
   ... //код, если диалог закрыт accept()
}
else
{
   ... //код, если диалог закрыт reject()
}


Название: Re: Подключение диалогового окна
Отправлено: Петр91 от Май 23, 2011, 05:32
Задача в сделать в отдельном окне параметры программы. Вообщем если объясните как сдлеать, все остальное станет ясно.
Есть главная форма с кнопкой "Параметры" и Текстлэйблом. При нажатии на кнопку открывается новое окно(форма) также с кнопкой, при нажатии на которую в главной форме в текстлэйбле отобразиться число. Напишите пожалуйста код! И мне сразу все станет ясно. Создал форму, создал диалоговое окно с кнопкой, а что дальше?


Название: Re: Подключение диалогового окна
Отправлено: LisandreL от Май 23, 2011, 06:21
Я ж вам написал, что не show() диалог надо показывать, а exec().


Название: Re: Подключение диалогового окна
Отправлено: Петр91 от Май 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


Название: Re: Подключение диалогового окна
Отправлено: Mikhail от Май 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()));


Название: Re: Подключение диалогового окна
Отправлено: LisandreL от Май 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(); // говорим что диалог выполнился успешно (а не закрыт с отменой)
}


Название: Re: Подключение диалогового окна
Отправлено: Петр91 от Май 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


Название: Re: Подключение диалогового окна
Отправлено: LisandreL от Май 23, 2011, 08:17
Цитировать
Вы наверное имели в виду pushbutton которая принадлежит Dial а не lineEdit.
Число то у вас где вводится? Не в кнопку же.

Цитировать
connect(&dial,SIGNAL(sendTtl(int)),this,SLOT(ttl(int)));
Вы переменную dial должны связывать, а не тип Dial.


Название: Re: Подключение диалогового окна
Отправлено: Петр91 от Май 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() я не могу выйти за ее пределы. теперь мне нужная другая форма но уже такая, что бы можно было кликать на главную форму, причем диалоговое окно должно оставаться поверх.


Название: Re: Подключение диалогового окна
Отправлено: kambala от Май 23, 2011, 13:10
Код
C++ (Qt)
QDialog dialog;
dialog.show();
только тогда надо подписаться на сигнал accepted() (и rejected() если нужно), чтоб знать когда была нажата кнопка ОК или Cancel

либо вместо QDialog вообще QWidget использовать


Название: Re: Подключение диалогового окна
Отправлено: vasilii_ru от Февраль 26, 2012, 02:11
Спасибо LisandreL   :)