crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Диалоговое окно, проблемы
registr
  опции профиля:
сообщение 16.8.2010, 11:23
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 115
Регистрация: 16.11.2009
Пользователь №: 1234

Спасибо сказали: 8 раз(а)




Репутация:   1  


Не могу никак разобраться с появлением диалогового окна в главном окне. Помогите, пожалуйста, разобраться. Вот сам код:

createdialog.h
#ifndef CREATEDIALOG_H 
#define CREATEDIALOG_H

#include <QDialog.h>
#include "mainwindow.h"

class CreateDialog : public QDialog //, public MainWindow
{
   Q_OBJECT; // Макрос Q_0BJECT необходимо задавать в начале определения любого класса, содержащего сигналы или слоты.
  
   private slots:
      void okPush();
      void sph4();
      void sph5();
  
   private:  
      QLabel *info;
      
      QRadioButton *sph4Button;
      QRadioButton *sph5Button;
  
      QPushButton *okButton;
      QPushButton *cancelButton;
  
   public:
      CreateDialog(QWidget *parent=0); // !здесь происходит ошибка!
      
};
#endif


createdialog.cpp
#include <QtGui>
#include "mainwindow.h"
#include "createdialog.h"
#include "point3D.h"

static int iteration=4;

CreateDialog::CreateDialog(QWidget *parent) : QDialog(parent)
{
   QTextCodec *codec = QTextCodec::codecForName("CP1251"); // подключаю текстовые кодеки
   QTextCodec::setCodecForTr(codec);  
        
   this->setWindowTitle(tr("Создать карту...")); // название
  
   this->setModal(true); // модальное окно
  
   info = new QLabel(tr("Выберете, пожалуйста, детализацию карты:"), this);
  
   sph4Button = new QRadioButton(tr("Низкая"), this);
   sph5Button = new QRadioButton(tr("Средняя"), this);    
  
   sph4Button->setChecked(true);
      
   connect(sph4Button, SIGNAL(clicked()), this, SLOT(sph4()));
   connect(sph5Button, SIGNAL(clicked()), this, SLOT(sph5()));        
  
   okButton = new QPushButton(tr("Ok"));
   cancelButton = new QPushButton(tr("Отмена"));
  
   connect(okButton, SIGNAL(clicked()), this, SLOT(okPush()));
   connect(cancelButton, SIGNAL(clicked()), this, SLOT(close()));  
  
   QVBoxLayout *layout1 = new QVBoxLayout;
  
   QVBoxLayout *layout2 = new QVBoxLayout;
   QHBoxLayout *layout3 = new QHBoxLayout;
  
   layout2->addWidget(info);  
   layout2->addWidget(sph4Button);
   layout2->addWidget(sph5Button);  
  
   layout3->addWidget(okButton);
   layout3->addWidget(cancelButton);
  
   layout1->addLayout(layout2);
   layout1->addLayout(layout3);
  
   setLayout(layout1); // устанавливает менеджер компоновки для окна
   setFixedHeight(sizeHint().height()); // возвращает "идеальный" размер виджета
  
   this->show();              
}

void CreateDialog::okPush() {set_temp(iteration); this->close();}

void CreateDialog::sph4() {iteration=4;}

void CreateDialog::sph5() {iteration=5;}


В главном окне Диалог вызывается соответственно:
CreateDialog *create_dialog = new CreateDialog;


При компиляции выдается сообщение:
macro "CreateDialogW" requires 4 arguments, but only 1 given
макрос "CreateDialogW" требует 4 аргумента, но дан только 1

Выдается ошибка в файле createdialog.h в конструкторе
CreateDialog(QWidget *parent=0); // !здесь происходит ошибка!

declaration does not declare anything
декларация ничего не декларирует

Бью голову, не понимаю в чем дело... :(
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 16.8.2010, 11:29
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Попробуй дать другое имя классу, не CreateDialog, а например, просто Dialog.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 16.8.2010, 11:34
Сообщение #3


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(registr @ 16.8.2010, 15:23) *
#include <QDialog.h>
#include "mainwindow.h"
* первого файла точно не существует, хотя на виндовозе может и прокатит.
* второй файл за каким лешим в диалоге.

* В конструкторе диалога упоминается указатель на тип QWidget, однако а нём ни слуху ни духу (может, конечно, и из mainwindow.h)

П.С.
название у класса - CreateDialog, дурацкое. Класс - это имя существительное, а не глагол
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
registr
  опции профиля:
сообщение 16.8.2010, 11:45
Сообщение #4


Участник
**

Группа: Участник
Сообщений: 115
Регистрация: 16.11.2009
Пользователь №: 1234

Спасибо сказали: 8 раз(а)




Репутация:   1  


// Попробуй дать другое имя классу, не CreateDialog, а например, просто Dialog.

Делал по учебнику (Бланшет), там FindDialog, у меня соответственно CreateDialog, т.к. он отвечает диалогу создания карты. Разве в названии дело?

// * первого файла точно не существует, хотя на виндовозе может и прокатит.
один в один сделано из Бланшета 2008, 2-ое изд, стр. 12

// * второй файл за каким лешим в диалоге.
здесь вы правы, он не нужен

// * В конструкторе диалога упоминается указатель на тип QWidget, однако а нём ни слуху ни духу (может, конечно, и из mainwindow.h)
я не профи, сделал так, как в книге. Если сделать конструктор по умолчанию (т.е. CreateDialog()), то ошибка та же самая :(

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 16.8.2010, 11:48
Сообщение #5


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


registr, назови MyCreateDialog
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
registr
  опции профиля:
сообщение 17.8.2010, 12:12
Сообщение #6


Участник
**

Группа: Участник
Сообщений: 115
Регистрация: 16.11.2009
Пользователь №: 1234

Спасибо сказали: 8 раз(а)




Репутация:   1  


BRE, Litkevich Yuriy, Алексей1153 спасибо! Назвал класс MyDialog и конструктор MyDialog() - диалоговое окно появилось.

Но появилась другая проблема. (см. рисунок demo.jpg).

У меня есть два разных класса: MainWindow и MyDialog. Метод нажатия на клавишу "Oк" okPush() принадлежит классу MyDialog, а метод создания новой карты create_new() принадлежит классу MainWindow. А как их сочленить так, чтобы при нажатии на клавишу "Ok" вызывался метод create_new()? Подскажите пожалуйста как это сделать граммотно и профессионально?
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 17.8.2010, 12:18
Сообщение #7


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Если грамотно - то лучше сделать класс-менеджер карты, ну а так - отправить сигнал от MyDialog к MainWindow, в слоте которого вызвать нужную функцию. Или саму эту функцию слотом и назначить
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 17.8.2010, 12:19
Сообщение #8


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


void MainWindow::createMap()
{
    MyDialog dlg( this );
    if( dlg.exec() )
    {
        // Сюда попадаем, если пользователь выбрал Ok
        int detailed_maps = dlg.getDetailedMaps();    // Спрашиваем у диалога, какую детализацию выбрал пользователь
        create_new( detailed maps );
    }
}

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 17.8.2010, 12:20
Сообщение #9


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


registr, и слово "пожалуйста" с диалога убери - чай не в Англии )) Даже как-то некрасиво смотрится

Сообщение отредактировал Алексей1153 - 17.8.2010, 12:20
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
registr
  опции профиля:
сообщение 17.8.2010, 12:29
Сообщение #10


Участник
**

Группа: Участник
Сообщений: 115
Регистрация: 16.11.2009
Пользователь №: 1234

Спасибо сказали: 8 раз(а)




Репутация:   1  


Цитата(BRE @ 17.8.2010, 13:19) *
void MainWindow::createMap()
{
    MyDialog dlg( this );
    if( dlg.exec() )
    {
        // Сюда попадаем, если пользователь выбрал Ok
        int detailed_maps = dlg.getDetailedMaps();    // Спрашиваем у диалога, какую детализацию выбрал пользователь
        create_new( detailed maps );
    }
}

О, спасибо!

Цитата(Алексей1153 @ 17.8.2010, 13:18) *
Если грамотно - то лучше сделать класс-менеджер карты, ну а так - отправить сигнал от MyDialog к MainWindow, в слоте которого вызвать нужную функцию. Или саму эту функцию слотом и назначить

Гы, а как отправить сингал? Как я понимаю сингал определяется только в классе и является функцией-членом данного класса. А тут получается два разных объекта разных классов со своими функциями-методами, вчера весь вечер голову ломал :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 27.4.2024, 20:15