Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Qt и кроссплатформенное программирование С/С++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.07.2012, 05:02   #1
Mixim
Форумчанин
 
Регистрация: 29.10.2009
Сообщений: 259
Печаль Qt Creator и добавление/использование N форм в приложении на нем

Знакомлюсь с Qt, кроссплатформенным программированием и вспоминаю язык C++. Вопрос, заданный в теме, является очень простым, но я не могу разобраться с его решением.
Создаем в Qt Creator новый проект Qt Widget=>GUI приложение - проект успешно создался, появилось окно MainWindow, в которое добавляем разные кнопки и прочие элементы GUI. Добавляем в проект новое окно(Проекты=>Формы=>Добавить новый=>Qt=>Форма Qt Designer), которое называем MyForm. Теперь накидываем в это окно нужные кнопки(PushButton), пытаемся перейти к слоту(создать его), а в ответ получаем:
Цитата:
Не удалось найти документы соответствующие «ui_myform.h».
Возможно, пересборка проекта поможет.
Как-то очень странно, что при создании окна через Qt Creator не создался header. Добавляю требуемый файл("ui_myform.h") в Редакторе в Заголовочные - ошибка сохраняется. Смотрю на имя header-файла MainWindow - "mainwindow.h" - возникает мысль, что "ui_" в начале имени файла - это просто маркер того, к чему он относится(User Interface). Аналогичным образом создаю файл с именем "myform.h", пытаюсь добавить слот, но проблема какая была, такая и осталась.
Пробовал, по совету из диалогового окна, выполнять пересборку проекта(Сборка=>Очистить проект; Сборка=>Пересобрать проект), но толку ровно ноль! Это первая проблема, связанная с использованием нескольких окон в проекте.
Теперь пытаюсь открыть из MainWindow окно MyForm - просто пишу:
Код:
void MainWindow::on_pushButton_clicked()
{
    MyForm myForm = new MyForm();
    myForm.Show();
}
на что получаю:
Цитата:
/home/mixim/QtSDK/Projects/untitled1-build-desktop-Desktop_Qt_4_8_1_for_GCC__Qt_SDK___ ____/../untitled1/mainwindow.cpp:19: ошибка: 'MyForm' was not declared in this scope
/home/mixim/QtSDK/Projects/untitled1-build-desktop-Desktop_Qt_4_8_1_for_GCC__Qt_SDK___ ____/../untitled1/mainwindow.cpp:19: ошибка: expected ';' before 'myForm'
/home/mixim/QtSDK/Projects/untitled1-build-desktop-Desktop_Qt_4_8_1_for_GCC__Qt_SDK___ ____/../untitled1/mainwindow.cpp:20: ошибка: 'myForm' was not declared in this scope
Если верно понимаю, то это значит:
Цитата:
1)'MyForm' не объявлена в области видимости;
2)ожидалось ';' перед 'myForm';
3)'myForm' не объявлена в этой области видимости
Пробую в инклудах 'mainwindow.cpp' указать:
Цитата:
#include "myForm.h"
, который, напомню, добавлял еще при попытке решить предыдущую проблему и который не исключил из проекта. На что получаю:
Цитата:
/home/mixim/QtSDK/Projects/untitled1-build-desktop-Desktop_Qt_4_8_1_for_GCC__Qt_SDK___ ____/../untitled1/mainwindow.cpp:3: ошибка: myForm.h: No such file or directory
Как понимаю, причина первой и второй проблемы одна и та же - Qt Creator не может сам "подцепить" header-файл к cpp окна - в принципе ошибка ясна, но каким макаром вручную это сделать, полазил по меню Creator'а, но ничего подходящего не нашел? Уважаемые Qt'еры, подскажите пожалуйста что делаю не так, каким образом можно решить возникшую у меня проблему(буду крайне признателен, если кто-нибудь распишет необходимые действия по шагам)?
Заранее всем спасибо за помощь.
Из всех классических книг, посвященных программированию, ненавижу всего одну - русский перевод книги Роберта Седжвика-"Фундаментальные алгоритмы C++". Предпочитаю читать её в оригинале.
Mixim вне форума Ответить с цитированием
Старый 18.07.2012, 09:02   #2
Hejerdal
Пользователь
 
Регистрация: 03.07.2012
Сообщений: 14
По умолчанию

1. При добавлении в проект формы QtDesigner, создаётся файл с расширением .ui,допустим Name.ui, а уже на этапе компиляции автоматически создаётся пара Name.h, Name.cpp в соответствующей динамической папке. Приведённого вами кода недостаточно, чтобы понять какое собственно имя у класса и соответственно у файла формы (ui_myform, myform, MyForm или myForm), ошибка скорее всего именно в том, что в #include вы указываете не то.

2.
Код:
    MyForm myForm = new MyForm();
Это ошибка. Оператор new возвращает указатель на объект класса, а объявляете вы объект. Поэтому, либо
Код:
    MyForm myForm;
    myForm.Show();
, либо
Код:
    MyForm* myForm = new MyForm();
    myForm->Show();
Hejerdal вне форума Ответить с цитированием
Старый 19.07.2012, 04:58   #3
Mixim
Форумчанин
 
Регистрация: 29.10.2009
Сообщений: 259
По умолчанию

Цитата:
Сообщение от Hejerdal Посмотреть сообщение
2.
Оператор new возвращает указатель на объект класса, а объявляете вы объект. Поэтому, либо
Код:
    MyForm myForm;
    myForm.Show();
, либо
Код:
    MyForm* myForm = new MyForm();
    myForm->Show();
Благодарю, также помогла тема с CyberForum. Однако имеется небольшая аналогичная проблема:
после открытия окна следующим образом:
Код:
   Form curForm;
   curForm.show();
да, оно открывается, но тут же закрывается(юЗверь его даже не успевает увидеть, его открытие лицезрел только при запуске через отладчик)! Пару дней назад на каком-то форуме видел тему с такой же проблемой, но ни адреса форума, ни методики решения не помню. Почему так происходит и что нужно исправить?
Edit:
После правки кода на следующий, вторая форма нормально открывается и не закрывается:
Код:
Form *curForm = new Form();
    curForm->show();
но все же интересно, почему при первом варианте использования форма сразу после открытия закрывалась
Из всех классических книг, посвященных программированию, ненавижу всего одну - русский перевод книги Роберта Седжвика-"Фундаментальные алгоритмы C++". Предпочитаю читать её в оригинале.

Последний раз редактировалось Mixim; 19.07.2012 в 05:30.
Mixim вне форума Ответить с цитированием
Старый 19.07.2012, 08:58   #4
Hejerdal
Пользователь
 
Регистрация: 03.07.2012
Сообщений: 14
По умолчанию

Это потому, что при создании объекта вспомогательного класса, его область видимости ограничивается рамками функции внутри которой он объявлен (в общем случае блоком внутри "{ }"). После того, как функция (блок) заканчивается, объект уничтожается. При выделении памяти динамически, механизм другой. Вообще, лучше всего объявлять указатель на вспомогательную форму в описании основной (в хэдере), выделять память в конструкторе или чём-нибуть типа init(), а об освобождении памяти позаботится Qt, при уничтожении основной формы.

Лучшая книга по Qt на мой вкус: "C++ GUI Programming With Qt 4" - Jasmin Blanchette, Mark Summerfield, вроде и русский перевод неплохой есть. Но вам конечно ещё нужно почитать про чистый С++, чтобы основательно разобраться в работе с памятью и т.д.
Hejerdal вне форума Ответить с цитированием
Старый 19.07.2012, 11:20   #5
Mixim
Форумчанин
 
Регистрация: 29.10.2009
Сообщений: 259
По умолчанию

Да простят меня создатели .NET(C#), но он отучил напрочь от логики C++, вроде бы и назван почти также как плюсы, пишут что он является расширением плюсов, но 2-3 года работы в нем и полное забытие C++ гарантировано - единственного во-истинну кросплатформенного языка(Qt) - IMHO. MS и его соратники кричат на каждой конференции, что native'языки - это прошлое, но что еще может гарантировать кросплатформенность?!
Небольшой оффтоп: да, есть бесплатный кросплатформенный Mono, Mono Project, Gtk#, но у его компилятора есть некоторые проблемы с Linux(кажется на BugZilla уже около года весит тема с описанием бага(англ.):"Mono Develop установился в Linux нормально, но не запускается") и так этот баг не решен(сам ощутил его на себе).
Спасибо большое за совет:
Цитата:
Сообщение от Hejerdal Посмотреть сообщение
Лучшая книга по Qt на мой вкус: "C++ GUI Programming With Qt 4" - Jasmin Blanchette, Mark Summerfield, вроде и русский перевод неплохой есть. Но вам конечно ещё нужно почитать про чистый С++, чтобы основательно разобраться в работе с памятью и т.д.
Действительно будет время, надо будет освяжить в памяти чистый C++ - ничерта уже не помню(где-то читал статью, в которой автор высказывал свои мысли по-поводу того, за какое количество времени забывается язык программирования, который не используется на практике - мой случай)!
Небольшой совет студентам, изучающим на летней практике .NET/C# - сдайте все задания по C#, напишите отчет и забудте о нем, иначе прощай кросплатформенность и универсальность программ(про templates в C# я вообще молчу)! Я не спорю, что в C# есть очень много хороших вещей, лично мне безумно нравился WPF и DataBinding, а также язык разметки XAML, если бы это добавили в C++, то у C# бы лишился вообще всех своих преимуществ по сравнению с ним.
Небольшие извинения и просьба к активными участниками раздела " Кроссплатформенное программирование C/C++": прошу вас не возмущаться и не издеваться надо мной, если буду задавать глупые/тупые вопросы по C++, забыл его в силу долгого не использования
Из всех классических книг, посвященных программированию, ненавижу всего одну - русский перевод книги Роберта Седжвика-"Фундаментальные алгоритмы C++". Предпочитаю читать её в оригинале.

Последний раз редактировалось Mixim; 19.07.2012 в 11:58. Причина: добавление
Mixim вне форума Ответить с цитированием
Старый 29.07.2012, 05:56   #6
Mixim
Форумчанин
 
Регистрация: 29.10.2009
Сообщений: 259
По умолчанию

Возник небольшой связный с этой темой вопрос, начну по-порядку.
Реализую GUI-приложение на Qt под Linux. Предполагается, что оно будет работать(незакрываться) 24 часа в сутки 7 дней в неделю.
Логика работы примерно следующая: открываем главную форму, на которой есть кнопки(открыть форму2, форму3 и т.д.); при нажатии на одну из кнопок, главная форма закрывается, открывается выбранная; на выбранной форме пользователь выполняет необходимые операции(ввод данных и прочее), нажимаеет "Далее", данные отправляются в определенное место, текущая форма закрывается, открывается вновь главная(привел очень сжатую последовательность открытия/закрытия форм, поэтому постоянно хранить в памяти все формы - непозволительная роскошь). Операции открытия/закрытия форм могут повторяться каждые 2 минуты=>после закрытия каждой формы необходимо чистить память. Пишу следующий черновой вариант обработчика в MainWindow:
Код:
void MainWindow::on_pushButton_2_clicked()
{
    Form1 *form1=new Form1();
    form1->show();

    this->close();
    delete this;
}
А в main.cpp у меня следующее:
Код:
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow *w=new MainWindow();
    w->show();
    
    return a.exec();
}
По идеи, при выполнении команды:
Код:
    delete this;
память, выделенная текущей форме, должна чиститься, но хотелось бы узнать так ли это?
Сам являюсь крайне скупым на память человеком(практически за один бит удавлюсь), руководствуюсь принципом: сколько взял - столько и отдал, из-за чего сперва с крайним неуважением относился к .NET/C#, пока не узнал про GC.
Если же даже самым приблизительным образом посмотреть на частоту открытия/закрытия форм, то получим за сутки:
Цитата:
24часа*60минут/2минуты=720открытий только главной формы в сутки
под главную форму выделяется 300кбайт=>720*300кбайт=216000кбайт= 210мбайт
а терять такие объемы - это явно перебор.
Поэтому прошу подсказать: будет ли очищаться память при использовании указанной методики?
Из всех классических книг, посвященных программированию, ненавижу всего одну - русский перевод книги Роберта Седжвика-"Фундаментальные алгоритмы C++". Предпочитаю читать её в оригинале.
Mixim вне форума Ответить с цитированием
Старый 30.07.2012, 15:50   #7
Hejerdal
Пользователь
 
Регистрация: 03.07.2012
Сообщений: 14
По умолчанию

delete именно, что и освобождает память, выделенную под объект. Другое дело, что в вашей ситуации, главное окно целесообразнее будет не уничтожать и создавать каждый раз, а вызывать hide()/show().
Hejerdal вне форума Ответить с цитированием
Старый 01.08.2012, 07:33   #8
Mixim
Форумчанин
 
Регистрация: 29.10.2009
Сообщений: 259
По умолчанию

Цитата:
Сообщение от Hejerdal Посмотреть сообщение
delete именно, что и освобождает память, выделенную под объект. Другое дело, что в вашей ситуации, главное окно целесообразнее будет не уничтожать и создавать каждый раз, а вызывать hide()/show().
Благодарю, последнее постараюсь учесть
Из всех классических книг, посвященных программированию, ненавижу всего одну - русский перевод книги Роберта Седжвика-"Фундаментальные алгоритмы C++". Предпочитаю читать её в оригинале.
Mixim вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ВебБраузер и использование в нем соксов Зод Работа с сетью в Delphi 0 21.12.2011 13:06
Использование Asm в Qt Creator Pecho Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 25.11.2011 00:45
Использование DSPack в консольном приложении Jacobson Мультимедиа в Delphi 5 21.06.2010 05:21
Использование функций из других форм JustKurt Общие вопросы Delphi 10 12.07.2009 21:16
Использование 2х форм Zeraim Общие вопросы Delphi 4 27.05.2008 17:14