Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Qt] Создание своей формы диалога. 
:(
    Опции темы
Elfet
Дата 19.11.2009, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



Всем привет! 

Помогите, пожалуйста, разобраться с формами в Qt.

Создаю такую форму:
Код

#ifndef ZONECONNECT_H
#define ZONECONNECT_H

#include <QtGui>
#include <QDialog>

#include <vector>
#include <math.h>
#include <smartflowlib.h>


namespace Ui
{
    class ZoneConnect;
}

class ZoneConnect : public QDialog
{
public:
    ZoneConnect(QWidget * parent = 0);
private:
    Ui::ZoneConnect *ui;

};

#endif // ZONECONNECT_H



Код

#include "zoneconnect.h"
#include "ui_zoneconnect.h"

ZoneConnect::ZoneConnect(QWidget * parent)
        : QDialog(parent), ui(new Ui::ZoneConnect)
{
    ui->setupUi(this);
}



Затем вызываю её так:

Код

ZoneConnect zoneConnectDialog(this);
zoneConnectDialog.exec();


А вот как проверить какая кнопка была нажата в форме? И как вернуть после закрытия формы какой-нибудь параметр? (Например текст)

Пытаюсь во так вот сделать, но не выходит: 
Код

if(zoneConnectDialog.exec() == QDialogButtonBox::Ok)QMessageBox::information(this, "OK", "OK", QMessageBox::Ok);


Заранее спасибо за помощь!

Это сообщение отредактировал(а) Elfet - 19.11.2009, 13:54


--------------------
PM MAIL WWW Skype   Вверх
andrew_121
Дата 19.11.2009, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 11
Всего: 33



Цитата(Elfet @  19.11.2009,  13:53 Найти цитируемый пост)
А вот как проверить какая кнопка была нажата в форме?

А кнопки кто на форму ложит?

Это сообщение отредактировал(а) andrew_121 - 19.11.2009, 14:16


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Elfet
Дата 19.11.2009, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



andrew_121, а они уже там были. Я её через QtDesigner создал.


--------------------
PM MAIL WWW Skype   Вверх
andrew_121
Дата 19.11.2009, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 11
Всего: 33



Цитата(Elfet @  19.11.2009,  15:36 Найти цитируемый пост)
andrew_121, а они уже там были. Я её через QtDesigner создал. 

Вот: http://forum.vingrad.ru/forum/topic-270481.html


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Elfet
Дата 19.11.2009, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



Цитата(Любитель @  23.8.2009,  16:52 Найти цитируемый пост)
Используй метод done или вручную хайди диалог перед закрытием. В QDialog переопределён closeEvent, для видимого диалога он автоматом вызывает reject. 

Если чесно я не понял как это сделать. Вместо exec использовать done и всё?


--------------------
PM MAIL WWW Skype   Вверх
null56
Дата 20.11.2009, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 6
Всего: 12



Elfet, если ты пользуешь exec,
Код

int QDialog::exec ()   [slot]

Shows the dialog as a modal dialog, blocking until the user closes it. The function returns a DialogCode result.

If the dialog is application modal, users cannot interact with any other window in the same application until they close the dialog. If the dialog is window modal, only interaction with the parent window is blocked while the dialog is open. By default, the dialog is application modal.

то ты (предполагаю, раз ты делал по умолчанию в дизайнере) можешь получить лишь два ответа
Код

enum QDialog::DialogCode

The value returned by a modal dialog.

Constant    Value
QDialog::Accepted    1
QDialog::Rejected    0

по умолчанию кнопки ok, возвращает значение Accepted, Cancel = Rejected

Если ты создаешь собственный диалог со множеством кнопок, то за возвращаемый ответ придется отвечать самому через слоты или другие элементы управления
PM MAIL   Вверх
Elfet
Дата 20.11.2009, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



null56, ок. ясно. спасибо. А можно как-то самому возвращать? А то не охота через слоты.


--------------------
PM MAIL WWW Skype   Вверх
null56
Дата 20.11.2009, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 6
Всего: 12



У диалогов, я так понимаю, что нет, такая у них природа
Цитата

Modal dialogs are often used in situations where a return value is required, e.g. to indicate whether the user pressed OK or Cancel. A dialog can be closed by calling the accept() or the reject() slots, and exec() will return Accepted or Rejected as appropriate. The exec() call returns the result of the dialog. The result is also available from result() if the dialog has not been destroyed.


а вот если использовать наследника от QMessageBox, то тут есть более интересные методы понять, какая клавиша была нажата, пример из ассистента
Код

 QMessageBox msgBox;
 msgBox.setText("The document has been modified.");
 msgBox.setInformativeText("Do you want to save your changes?");
 msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
 msgBox.setDefaultButton(QMessageBox::Save);
 int ret = msgBox.exec();
// собственно определяем, что было нажато
 switch (ret) {
   case QMessageBox::Save:
       // Save was clicked
       break;
   case QMessageBox::Discard:
       // Don't Save was clicked
       break;
   case QMessageBox::Cancel:
       // Cancel was clicked
       break;
   default:
       // should never be reached
       break;
 }

PM MAIL   Вверх
Elfet
  Дата 21.11.2009, 00:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



null56, QmessageBox понятно. А если я хочу свою кнопку разместить на форме?


--------------------
PM MAIL WWW Skype   Вверх
null56
Дата 21.11.2009, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 6
Всего: 12



1) Для того, чтобы обработать нажатие кнопки на обычной форме, тебе нужен обработчик, которым выступает SLOT
2) К одному слоту ты можешь подключить несколько сигналов, хоть от всех кнопок на форме
3) В этом единственном слоте ты всегда можешь узнать, какой объект сгенерировал сигнал через функцию
Код

QObject * sender () const

приведя к типу QPushButton *, а там уже по каким - то ранее установленным признакам (например названию или еще какому - нибудь признаку, который ты можешь выставить, если создашь собственный класс PushButton наследник от QPushButton) сможешь узнать какая была нажата кнопка
PM MAIL   Вверх
Elfet
Дата 23.11.2009, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



null56, ок, со слотами я понимаю как сделать. А как без них? Через возвращаемое значение формой возможно? Например как работают формы открытия и сохранения файла.


--------------------
PM MAIL WWW Skype   Вверх
alex7annet
Дата 1.12.2011, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 1.12.2011

Репутация: нет
Всего: нет



Знаю ответ конечно с опозданием, но сам наткнулся на подобную проблему. Суть проблемы в том, как все таки работают QMessage и конструкции типа 

Код

fileName = QFileDialog::getOpenFileName(this,  tr("Open Image"), "/home/jana", tr("Image Files (*.png *.jpg *.bmp)"));


В fileName уже попадает путь файла, при этом не нужно присоединяться не к каким слотам;))

После небольшого изучения исходника QDialog::exec нашел для себя такой интересный класс, как QEventLoop. Вот рабочее решение на основе него: 

Код

// Запуск диалога
QString MyDialog::exec() {

  this->show();   this->raise();   this->activateWindow();

  eventLoop.exec();                        //   здесь программа будет стоять пока не будет выполнен eventLoop.exit();

  return result;

} //QString MyDialog::exec()

void MyDialog::handler_accepted() {
  
  result = "Ура accept!!"
  eventLoop.exit();
  this->close();

} //void MyDialog::handler_accepted()

// Обработчик отмены
void MyDialog::handler_cancel() {
  
  result = "Ура cancel!!"
  eventLoop.exit();
  this->close();

} //void MyDialog::handler_cancel()


Теперь я могу использовать это так:

Код

MyDialog dialog
QString dlgResult = dialog.exec();


Думаю это и есть решение поставленной выше задачи;)))


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.1386 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.